我很难找到有关如何在模型中查询更复杂属性的任何类型的文档。
例如我有
public class MyEmbedded{
@EmbeddedID
private MyEmbeddedPK embeddedPK;
}
@Embeddable
public class MyEmbeddedPK{
private Integer age;
private Integer zip;
}
在我的存储库中,我正在实现CrudRepository,并希望能够做到
public List<MyEmbedded> findByageAndZip(String age, String zip);
但这似乎不起作用。关于@ EmbeddedId&s的文档并没有真正说明。查询@OneToMany属性也是如此,我从来没有找到任何东西。
我引用的文档。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords
有关于此查询创建如何工作的更好的文档吗?
答案 0 :(得分:1)
我不确定Spring Data Jpa是否支持此功能,并且基于嵌入式id属性进行查询似乎有点复杂,因为它同样适用于封闭实体本身的状态字段。但是使用JP QL可以通过使用Query和@Param
指定它来轻松实现@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);
另外,不要忘记使用以下签名指定存储库,因为Spring数据运行时需要知道ID类的实际类型。
@Repository
public interface MyEmbeddedRepository extends CrudRepository<MyEmbedded, MyEmbeddedPK> {..}
答案 1 :(得分:1)
我想我找到了答案,奇怪的是它在文档中,但我只是没有接受它。您只需要通过驼峰案例将属性组合在一起。我可以发誓我试过这个,但显然我的情况搞砸了。
第4.4.3节。属性表达式
但是,您也可以通过遍历嵌套属性来定义约束。假设一个人有一个带ZipCode的地址。在这种情况下,方法名称为
列出findByAddressZipCode(ZipCode zipCode);
创建属性遍历x.address.zipCode。解析算法首先将整个部分(AddressZipCode)解释为属性,并检查域类中是否具有该名称的属性(未大写)。如果算法成功,则使用该属性。如果没有,算法将来自右侧的驼峰案例部分的源分成头部和尾部,并尝试找到相应的属性,在我们的示例中,AddressZip和Code。如果算法找到具有该头部的属性,则它采用尾部并继续从那里构建树,以刚刚描述的方式将尾部分开。如果第一个分割不匹配,算法会将分割点移动到左侧(地址,ZipCode)并继续。