动态删除org.hibernate.Criteria中结果集的排序

sil*_*ier 5 hibernate criteria

我有一个标准:

Criteria criteria= session.createCriteria(Libro.class).addOrder( Order.asc("ID") );
Run Code Online (Sandbox Code Playgroud)

但是,当我想让rowcount失败时:

criteria.setProjection(Projections.rowCount());  
Run Code Online (Sandbox Code Playgroud)

因为查询中有一个订单.

如何动态删除条件中的排序?

我的意思是,我正在寻找criteria.removeOrder("ID").

小智 6

大多数标准实际上是CriteriaImpl的实例.如果将Criteria转换为CriteriaImpl并获取订单的迭代器,则可以将其删除.

Criteria criteria= session.createCriteria(Libro.class).addOrder( Order.asc("ID") );
Iterator<Order> orderIter = ((CriteriaImpl)criteria).iterateOrderings();
while (orderIter.hasNext()) {
    orderIter.next();
    orderIter.remove();
}

Long totalRows = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult();
Run Code Online (Sandbox Code Playgroud)


Don*_*oby 5

听起来你正在尝试重新使用为获取有序列表而制定的Criteria而不是计数.

您可能最好只创建独立的Criteria,而不是尝试使用相同的Criteria来检索数据和进行计数.

使用

Criteria orderCriteria= session.createCriteria(Libro.class)
                               .addOrder( Order.asc("ID") );
Run Code Online (Sandbox Code Playgroud)

按顺序检索列表,并使用

Criteria countCriteria= session.createCriteria(Libro.class)
                               .setProjection(Projections.rowCount());
Run Code Online (Sandbox Code Playgroud)

获得计数.

为了两个目的使用相同的Criteria,您必须更改用法之间的状态.我不确定如何删除订单(或者如果你真的需要为了计算).要删除投影,只需要setProjection(null).