From 9f6b6f3cbd4fd60968d82760d382b1ac3c0949f3 Mon Sep 17 00:00:00 2001 From: Jesse Friedland Date: Thu, 14 May 2020 17:23:44 -0400 Subject: [PATCH] #566 - Demonstrate custom query on a two entity aggregate. Based on the discussion at https://stackoverflow.com/questions/52978700/how-to-write-a-custom-query-in-spring-data-jdbc --- .../springdata/jdbc/basics/aggregate/LegoSet.java | 1 + .../jdbc/basics/aggregate/LegoSetRepository.java | 10 ++++++++++ .../jdbc/basics/aggregate/AggregateTests.java | 5 ++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSet.java b/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSet.java index 6b728db5..95275b7c 100644 --- a/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSet.java +++ b/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSet.java @@ -19,6 +19,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.With; +import lombok.With; import java.time.Period; import java.time.temporal.ChronoUnit; diff --git a/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSetRepository.java b/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSetRepository.java index 5e2d8e75..ec6970ad 100644 --- a/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSetRepository.java +++ b/jdbc/basics/src/main/java/example/springdata/jdbc/basics/aggregate/LegoSetRepository.java @@ -36,6 +36,16 @@ interface LegoSetRepository extends CrudRepository { " WHERE :age BETWEEN l.min_age and l.max_age") List reportModelForAge(@Param("age") int age); + /** + * See https://stackoverflow.com/questions/52978700/how-to-write-a-custom-query-in-spring-data-jdbc + * @param name + * @return + */ + @Query("select a.*, b.handbuch_id as manual_handbuch_id, b.author as manual_author, b.text as manual_text from lego_set a " + + "join handbuch b on a.id = b.handbuch_id " + + "where name = :name") + List findByName(@Param("name") String name); + @Modifying @Query("UPDATE model set name = lower(name) WHERE name <> lower(name)") int lowerCaseMapKeys(); diff --git a/jdbc/basics/src/test/java/example/springdata/jdbc/basics/aggregate/AggregateTests.java b/jdbc/basics/src/test/java/example/springdata/jdbc/basics/aggregate/AggregateTests.java index 71176e98..752452f7 100644 --- a/jdbc/basics/src/test/java/example/springdata/jdbc/basics/aggregate/AggregateTests.java +++ b/jdbc/basics/src/test/java/example/springdata/jdbc/basics/aggregate/AggregateTests.java @@ -23,6 +23,7 @@ import java.time.Period; import java.util.Arrays; import java.util.List; +import org.assertj.core.api.Assertions; import org.assertj.core.groups.Tuple; import org.junit.Test; import org.junit.runner.RunWith; @@ -72,7 +73,6 @@ public class AggregateTests { legoSets = repository.findAll(); Output.list(legoSets, "Manual replaced"); checkLegoSets(legoSets, "One last attempt: Just build a car! Ok?", 3); - } @Test @@ -111,6 +111,9 @@ public class AggregateTests { // SUV, F1 Ferrari 2018 and Muck get updated assertThat(updated).isEqualTo(3); + + final List legoSetsByName = repository.findByName("Small Car 01"); + assertThat(legoSetsByName).hasSize(1); } private LegoSet createLegoSet(String name, int minimumAge, int maximumAge) {