我试图找到所有具有一些嵌套元素和嵌套元素的实体,并且我需要通过这些集合的属性来找到它。按标准api搜索集合字段的嵌套属性
这将是这样的
class A{
private B b;
}
class B{
private Collection<C> cCol;
}
class C{
private String name;
}
所以我想所有有具有名称匹配给定参数C B元素的A元素。
不确定如何使用JPA Critieria API执行此操作。我知道JPQL中存在predicate或MEMEBER OF,但我需要通过collection中元素的属性进行搜索,而不是集合成员。
尝试的东西像root.get(a.b.c.name)
,并与root.fetch(a.b)
或root.fetch(b.c)
但总是结束了与非法API使用
'aQuery.distinct(true).where(cb.equal(root.get(“b”)。get(“cCol”)。get(“name”),searchString))''也应该给出相同的结果需要一个子查询 - 等价的JPQL查询应该是'SELECT DISTINCT a from a a JOIN ab b JOIN b.cCol c WHERE c.name =:searchString' – mata
我更喜欢子查询而不是DISTINCT JOIN的原因是性能。虽然我不是这方面的专家,但下面是一些支持它的资源:[(1)](https://danmartensen.svbtle.com/sql-performance-of-join-and-where-exists),[(2 )](http://www.toadworld.com/platforms/oracle/w/wiki/4773.exists-versus-distinct),[(3)](http://stackoverflow.com/questions/13692992/join-与存在性能),[(4)](http://stackoverflow.com/questions/12201885/how-to-determine-what-is-more-effective-distinct-or-where-exists)。当然,实际结果和性能增益取决于确切的用例。 –
工程就像一个魅力,谢谢! – Nadir