Java Spring数据JPA查询大楼通过;“查询创建”;@embeddedID的方法

Java Spring数据JPA查询大楼通过;“查询创建”;@embeddedID的方法,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,我正在努力寻找关于如何在模型中查询更复杂属性的任何类型的文档 比如我有 public class MyEmbedded{ @EmbeddedID private MyEmbeddedPK embeddedPK; } @Embeddable public class MyEmbeddedPK{ private Integer age; private Integer zip; } 在我的存储库中,我正在实现crudepository,并希望能够做到这一点

我正在努力寻找关于如何在模型中查询更复杂属性的任何类型的文档

比如我有

public class MyEmbedded{
@EmbeddedID
private MyEmbeddedPK embeddedPK;
}

@Embeddable
public class MyEmbeddedPK{

     private Integer age;

     private Integer zip;       
}
在我的存储库中,我正在实现crudepository,并希望能够做到这一点

public List<MyEmbedded> findByageAndZip(String age, String zip);
公共列表findByageAndZip(字符串年龄,字符串压缩);
但这似乎不起作用。文档中没有真正提到任何关于@EmbeddedId的内容。查询@OneToMany属性也是如此,我从来没有找到任何与此相关的内容

我引用的文档


是否有更好的文档说明此查询创建工作原理?

我不确定Spring Data Jpa是否支持此功能,并且基于嵌入式id属性进行查询似乎有点复杂,因为它同样适用于封闭实体本身的状态字段。但是,通过使用和@Param指定jpql,可以很容易地实现这一点

@Query("SELECT m FROM MyEmbedded m WHERE m.embeddedPK.age = :age AND m.embeddedPK.zip = :zip")
public List<MyEmbedded> findByageAndZip(@Param("age") String age, @Param("zip") String zip);
@Query(“从MyEmbedded m中选择m,其中m.embeddedPK.age=:age和m.embeddedPK.zip=:zip”)
公共列表findByageAndZip(@Param(“age”)字符串age,@Param(“zip”)字符串zip);
另外,不要忘记使用以下签名指定存储库,因为Spring数据运行时需要知道ID类的实际类型

@Repository
public interface MyEmbeddedRepository extends CrudRepository<MyEmbedded, MyEmbeddedPK> {..}
@存储库
公共接口MyEmbeddedDepository扩展了Crudepository{..}

我不确定Spring Data Jpa是否支持此功能,基于嵌入式id属性进行查询似乎有点复杂,因为它同样适用于封闭实体本身的状态字段。但是,通过使用和@Param指定jpql,可以很容易地实现这一点

@Query("SELECT m FROM MyEmbedded m WHERE m.embeddedPK.age = :age AND m.embeddedPK.zip = :zip")
public List<MyEmbedded> findByageAndZip(@Param("age") String age, @Param("zip") String zip);
@Query(“从MyEmbedded m中选择m,其中m.embeddedPK.age=:age和m.embeddedPK.zip=:zip”)
公共列表findByageAndZip(@Param(“age”)字符串age,@Param(“zip”)字符串zip);
另外,不要忘记使用以下签名指定存储库,因为Spring数据运行时需要知道ID类的实际类型

@Repository
public interface MyEmbeddedRepository extends CrudRepository<MyEmbedded, MyEmbeddedPK> {..}
@存储库
公共接口MyEmbeddedDepository扩展了Crudepository{..}

我想我找到了我的答案,奇怪的是,它出现在文档中,但我没有领会。您只需要通过camelcase将属性组合在一起。我可以发誓我试过这个,但很明显我的案子搞砸了

第4.4.3节。属性表达式

但是,也可以通过遍历嵌套特性来定义约束。假设一个人有一个ZipCode地址。在这种情况下,方法名为

列出findByAddressZipCode(ZipCode ZipCode)

创建属性traversal x.address.zipCode。解析算法首先将整个部分(AddressZipCode)解释为属性,并检查域类中是否有具有该名称(未资本化)的属性。如果算法成功,它将使用该属性。如果没有,该算法将源代码从右侧的驼峰大小写部分拆分为头部和尾部,并尝试找到相应的属性,在我们的示例中是AddressZip和Code。如果算法找到一个具有该头部的属性,它将获取尾部,并从那里继续构建树,以刚才描述的方式将尾部拆分。如果第一次拆分不匹配,算法将拆分点向左移动(地址,ZipCode)并继续


我想我找到了我的答案,奇怪的是,它在文档中,但我只是没有领会。您只需要通过camelcase将属性组合在一起。我可以发誓我试过这个,但很明显我的案子搞砸了

第4.4.3节。属性表达式

但是,也可以通过遍历嵌套特性来定义约束。假设一个人有一个ZipCode地址。在这种情况下,方法名为

列出findByAddressZipCode(ZipCode ZipCode)

创建属性traversal x.address.zipCode。解析算法首先将整个部分(AddressZipCode)解释为属性,并检查域类中是否有具有该名称(未资本化)的属性。如果算法成功,它将使用该属性。如果没有,该算法将源代码从右侧的驼峰大小写部分拆分为头部和尾部,并尝试找到相应的属性,在我们的示例中是AddressZip和Code。如果算法找到一个具有该头部的属性,它将获取尾部,并从那里继续构建树,以刚才描述的方式将尾部拆分。如果第一次拆分不匹配,算法将拆分点向左移动(地址,ZipCode)并继续