2017-08-18 72 views
0

我目前正在用JPA CriteriaBuilder构建一个复杂的查询。
在这个查询中,我加入了一些小数据库。现在我只需要加入表格的最后一个条目。但我不知道我在哪里必须在查询中应用。JPA标准查询生成器:获取最后一个条目

这是一个虚拟的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

什么是“最后一项”? List字段的最后一个元素?提供实体类 –

+0

@NeilStockton是List的最后一个元素 Lars

回答

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)); 

我希望我能帮助别人。

+0

如果对象按照与其“id”不同的顺序放置在列表中,它们将工作吗? –

+0

这是一个很好的问题:思考: – Lars

0

首先,如果您关心列表中元素的顺序,则需要@OrderColumn注释。取决于维护列表顺序的任何其他机制取决于数据库和持久性提供者,并且在一般情况下不可靠。

假设你已经有了,你应该能够将class3.order()cb.size(class3)合并成一个谓词。

相关问题