Java spring数据jdbc:包含1-n关系实体的查询

Java spring数据jdbc:包含1-n关系实体的查询,java,sql,spring,spring-data,spring-data-jdbc,Java,Sql,Spring,Spring Data,Spring Data Jdbc,如何为包含1-n引用的实体编写查询 基于这些示例,我将用以下单元测试对其进行解释: @Test public void customQuery_ReferenceMultipleInstances() { // prepare LegoSet smallCar = createLegoSet("Small Car 01", 5, 12); smallCar.setManual(new Manual("Just put all the pieces together in the ri

如何为包含1-n引用的实体编写查询

基于这些示例,我将用以下单元测试对其进行解释:

@Test
public void customQuery_ReferenceMultipleInstances() {
  // prepare
  LegoSet smallCar = createLegoSet("Small Car 01", 5, 12);
  smallCar.setManual(new Manual("Just put all the pieces together in the right order", "Jens Schauder"));
  smallCar.addModel("suv", "SUV with sliding doors.");
  smallCar.addModel("roadster", "Slick red roadster.");
  repository.save(smallCar);

  // execute
  List<LegoSet> actual = repository.findByName("Small Car 01");
  Iterable<LegoSet> compare = repository.findAll();

  // verify
  assertThat(actual).as("same number of lego sets").hasSize(Lists.newArrayList(compare).size());
  assertThat(actual.get(0).getModels()).as("same number of models").hasSize(Lists.newArrayList(compare).get(0).getModels().size());
  assertThat(actual.get(0).getModels().get(0)).as("model must not be null").isNotNull();
  assertThat(actual.get(0).getModels().get(0).getName()).as("model must have a name").isNotEmpty();
}
在此版本中,测试失败w/

java.lang.AssertionError: [model must not be null] 
Expecting actual not to be null
好的,在那之后,我将另一个
JOIN
添加到
model

@Query("SELECT ls.id, ls.name, ls.min_age, ls.max_age, " +
      "h.handbuch_id AS manual_handbuch_id, h.author AS manual_author, h.text AS manual_text, " +
      "m.* " +
      "FROM lego_set ls JOIN handbuch h ON ls.id = h.handbuch_id " +
      "JOIN model m ON ls.id = m.lego_set " +
      "WHERE name = :name")
List<LegoSet> findByName(@Param("name") String name);
@Query(“选择ls.id、ls.name、ls.min\u age、ls.max\u age,”+
“h.handbuch\u id作为手动\u handbuch\u id,h.author作为手动\u作者,h.text作为手动\u文本,”+
“m.*”+
“从乐高设置ls在ls.id=h.handbuch\U id上加入handbuch h”+
“在ls.id=m.lego_集合上连接模型m”+
“其中name=:name”)
列出findByName(@Param(“name”)字符串名);
现在测试失败了w/

java.lang.AssertionError: [same number of lego sets] 
Expected size:<1> but was:<2> in:
<[LegoSet(id=1, name=Small Car 01, minimumAge=P5Y, maximumAge=P12Y, manual=Manual(id=1, author=Jens Schauder                                                                                       , text=Just put all the pieces together in the right order), models={suv=Model(name=suv, description=SUV with sliding doors.), roadster=Model(name=roadster, description=Slick red roadster.)}),
    LegoSet(id=1, name=Small Car 01, minimumAge=P5Y, maximumAge=P12Y, manual=Manual(id=1, author=Jens Schauder  
java.lang.AssertionError:[相同数量的乐高玩具]
预期大小:但为:英寸:

第一个查询实际上是正确的,并且运行良好

问题出在你的测试中<代码>模型
是一个
映射
,但您将其视为一个
列表
进行编译,因为列表索引也是一个有效的映射键

如果您像这样更改测试中的最后两个断言,它们将成功:

assertThat(actual.get(0).getModels().get("suv")).as("model must not be null").isNotNull();
assertThat(actual.get(0).getModels().get("suv").getName()).as("model must have a name").isNotEmpty();
// ----------------------------------------^

另一种方法是使用第二个查询,但将多个模型的多行收集到一个
LegoSet
中。我的情况类似,但我看不出我的情况有什么不同

我有三种型号: 客户:id,姓名。。 项目:id、名称、客户端id、列表 项目成员

这是我的密码查询

@Query(“”)
选择
project.id,
project.legacy_id,
project.code,
project.client_id,
project.u已存档,
project.name,
project.budget_类型,
project.hours\u budget\u max,
项目。资金\预算\最大值
从项目
在client.id=project.client\u id上加入客户端
其中client.name类似“%:name%”
""")
列出findByClientNameContainingIgnoreCase(最终字符串名称);
正如您所看到的,我正在寻找客户机名称(使用连接)与模式匹配的项目


手动执行请求可以得到预期的结果。但查看spring数据jdbc并没有给我任何结果

这是一个很好的问题。复制这个问题是轻而易举的事!谢谢。再深入一点,这可能与我对“%and%”的使用有关。我认为spring jdbc会在值名周围生成简单的引号,这将更改为我希望看到执行的请求
assertThat(actual.get(0).getModels().get("suv")).as("model must not be null").isNotNull();
assertThat(actual.get(0).getModels().get("suv").getName()).as("model must have a name").isNotEmpty();
// ----------------------------------------^