From bd98ee68a360c85191c8dcc67e9bcf76a5c7cb9a Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 24 Nov 2025 10:41:56 +0100 Subject: [PATCH 1/4] Upgrade to Spring Boot 4.0. Closes #693 Signed-off-by: Mohammadali Jalalkamali --- pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4b9ec47be..eb16bf0b9 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 4.0.0-RC2 + 4.0.0 @@ -39,8 +39,6 @@ 25 25 - 2025.1.0-RC2 - 7.0.0-RC3 From 05c8bec1d18953752f5706d38184886a30914d1f Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 27 Nov 2025 11:06:02 +0100 Subject: [PATCH 2/4] Polishing. Enable disabled examples, increment Hibernate version due to missing plugin. Signed-off-by: Mohammadali Jalalkamali --- jpa/jpa21/pom.xml | 11 ----------- jpa/pom.xml | 6 +++--- pom.xml | 1 + 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/jpa/jpa21/pom.xml b/jpa/jpa21/pom.xml index 4b671e584..216e925ae 100644 --- a/jpa/jpa21/pom.xml +++ b/jpa/jpa21/pom.xml @@ -11,15 +11,4 @@ spring-data-jpa-jpa21 Spring Data JPA - JPA 2.1 specific features - - - org.hibernate - hibernate-entitymanager - - - org.springframework.boot - spring-boot-autoconfigure - - - diff --git a/jpa/pom.xml b/jpa/pom.xml index b9533db63..ae599a509 100644 --- a/jpa/pom.xml +++ b/jpa/pom.xml @@ -21,15 +21,15 @@ deferred envers example + graalvm-native interceptors - + jpa21 + multitenant multiple-datasources query-by-example security showcase vavr - multitenant - graalvm-native diff --git a/pom.xml b/pom.xml index eb16bf0b9..de3189259 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ 1.1.3 + 7.1.10.Final 25 25 From 03068736b9eb717cac94151df1c24fbdec17c76a Mon Sep 17 00:00:00 2001 From: ali kamali Date: Sat, 29 Nov 2025 19:09:35 +0330 Subject: [PATCH 3/4] Add Talk and Speaker nested documents Signed-off-by: Mohammadali Jalalkamali --- .../elasticsearch/speaker/Speaker.java | 23 +++++++++++ .../elasticsearch/speaker/package-info.java | 4 ++ .../springdata/elasticsearch/talk/Talk.java | 38 +++++++++++++++++++ .../elasticsearch/talk/package-info.java | 4 ++ 4 files changed, 69 insertions(+) create mode 100644 elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/Speaker.java create mode 100644 elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/package-info.java create mode 100644 elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/Talk.java create mode 100644 elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/package-info.java diff --git a/elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/Speaker.java b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/Speaker.java new file mode 100644 index 000000000..c0d55d887 --- /dev/null +++ b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/Speaker.java @@ -0,0 +1,23 @@ +package example.springdata.elasticsearch.speaker; + +import lombok.Builder; +import lombok.Data; + +/** + * Speaker of a talk. + */ +@Data +@Builder +public class Speaker { + + /** + * Speaker name. + */ + private String name; + + /** + * Speaker position. + */ + private String position; +} + diff --git a/elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/package-info.java b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/package-info.java new file mode 100644 index 000000000..def2b0f75 --- /dev/null +++ b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/speaker/package-info.java @@ -0,0 +1,4 @@ +/** + * Domain classes for speaker examples in Spring Data Elasticsearch. + */ +package example.springdata.elasticsearch.speaker; diff --git a/elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/Talk.java b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/Talk.java new file mode 100644 index 000000000..67b108142 --- /dev/null +++ b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/Talk.java @@ -0,0 +1,38 @@ +package example.springdata.elasticsearch.talk; + +import example.springdata.elasticsearch.speaker.Speaker; + +import java.util.List; + +import lombok.Builder; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +/** + * Elasticsearch talk document. + */ +@Data +@Builder +@Document(indexName = "talks") +public class Talk { + + /** + * Document id. + */ + @Id + private String id; + + /** + * Talk title. + */ + private String title; + + /** + * Speakers of this talk. + */ + @Field(type = FieldType.Nested) + private List speakers; +} diff --git a/elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/package-info.java b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/package-info.java new file mode 100644 index 000000000..4a30c75ec --- /dev/null +++ b/elasticsearch/example/src/main/java/example/springdata/elasticsearch/talk/package-info.java @@ -0,0 +1,4 @@ +/** + * Domain classes for talk examples in Spring Data Elasticsearch. + */ +package example.springdata.elasticsearch.talk; From 0508dd944e44a37b0b69c67c3a67006b6900f624 Mon Sep 17 00:00:00 2001 From: ali kamali Date: Sat, 29 Nov 2025 19:15:49 +0330 Subject: [PATCH 4/4] Add Criteria test for nested speakers Signed-off-by: Mohammadali Jalalkamali --- .../ElasticsearchOperationsTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/elasticsearch/example/src/test/java/example/springdata/elasticsearch/conference/ElasticsearchOperationsTest.java b/elasticsearch/example/src/test/java/example/springdata/elasticsearch/conference/ElasticsearchOperationsTest.java index 4a52ba8a8..f0e1c6696 100644 --- a/elasticsearch/example/src/test/java/example/springdata/elasticsearch/conference/ElasticsearchOperationsTest.java +++ b/elasticsearch/example/src/test/java/example/springdata/elasticsearch/conference/ElasticsearchOperationsTest.java @@ -17,8 +17,12 @@ import static org.assertj.core.api.Assertions.*; +import example.springdata.elasticsearch.speaker.Speaker; +import example.springdata.elasticsearch.talk.Talk; + import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -103,4 +107,38 @@ void geoSpatialSearch() { assertThat(result).hasSize(2); } + + @Test + void criteriaQueryOnNestedSpeakers() { + + String speakerName = "Ali"; + var speaker = Speaker.builder() + .name(speakerName) + .position("Developer") + .build(); + + var talkWithSpeaker = Talk.builder() + .id("1") + .title("Spring & Elasticsearch") + .speakers(List.of(speaker)) + .build(); + + var talkWithoutSpeaker = Talk.builder() + .id("2") + .title("No Speakers Here") + .build(); + + operations.save(talkWithSpeaker); + operations.save(talkWithoutSpeaker); + + var criteria = new Criteria("speakers.name").is(speakerName); + var query = new CriteriaQuery(criteria); + + var result = operations.search(query, Talk.class); + + assertThat(result).hasSize(1); + assertThat(result.getSearchHits().get(0).getContent() + .getSpeakers().get(0).getName()) + .isEqualTo(speakerName); + } }