我目前正在使用JPA CriteriaBuilder构建一个复杂的查询 在这个查询中,我加入了一些小数据库。现在我只需要连接表的最后一个条目。但我不知道在查询中必须将其应用到哪里。
这是一个虚假的JPA查询:
private CriteriaQuery<Class2> getClass2Function {
CriteriaQuery<RootClass> cq = cb.createQuery(RootClass.class);
Root<RootClass> root = cq.from(RootClass.class);
Join<RootClass, Class2> class2 = root.join(RootClass_.class2Id);
ListJoin<Class2, Class3> class3 = class2.join(Class2_.listOfClass3);
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.isNull(class3.get(SomeModel_.dtDl)));
predicates.add(cb.isNull(class2.get(SomeModel_.dtDl)));
predicates.add(cb.isNull(root.get(SomeModel_.dtDl)));
return cq.select(class2).where(predicates.toArray(new Predicate[] {}))
.orderBy(cb.asc(class2.get(Class2_.id)));
}
现在我只需要ListJoin class3
的最后一个条目,我该怎么做?
问候
答案 0 :(得分:0)
我找到了解决方案 我需要添加以下代码:
Subquery<Long> sq = cq.subquery(Long.class);
Root<Class3> root = sq.from(Class3.class);
sq.select(cb.max(root.get(Class3_.id)));
predicates.add(cb.equal(class3.get(Class3_.id), sq));
我希望我可以帮助别人。
答案 1 :(得分:0)
首先,如果您关心列表中元素的顺序,则需要@OrderColumn
注释。取决于维护列表顺序的任何其他机制取决于数据库和持久性提供程序,并且在一般情况下,不可靠。
假设您已经拥有,那么您应该能够在谓词中将class3.order()
与cb.size(class3)
结合使用。