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

时间:2010-03-03 10:04:30

标签: hibernate criteria

我有一个标准:

Criteria criteria= session.createCriteria(Libro.class).addOrder( Order.asc("ID") );

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

criteria.setProjection(Projections.rowCount());  

因为查询中有订单。

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

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

6 个答案:

答案 0 :(得分: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();

答案 1 :(得分:5)

听起来您正在尝试重复使用为获取有序列表而制定的条件来获取计数。

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

使用

Criteria orderCriteria= session.createCriteria(Libro.class)
                               .addOrder( Order.asc("ID") );

按顺序检索列表,然后使用

Criteria countCriteria= session.createCriteria(Libro.class)
                               .setProjection(Projections.rowCount());

获得计数。

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

答案 2 :(得分:1)

我也遇到了同样的问题..但是我通过以下方式实现了,

在申请订单之前,我查询了记录数量,

criteria.addOrder(pageCriteria.isSortDescending() ? Order
                            .desc(pageCriteria.getSortBy()) : Order
                            .asc(pageCriteria.getSortBy()));

pageCriteria.setTotalRecords(((Integer) criteria
                            .setProjection(Projections.rowCount())
                            .uniqueResult()).intValue());
                criteria.setProjection(null);
                criteria.setFirstResult(
                        pageCriteria.getFirstRecordOfCurrentPage())
                        .setMaxResults(pageCriteria.getRecordsPerPage());
                criteria
                        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

以上代码适合我。

答案 3 :(得分:1)

criteria.ClearOrders()是NHibernate提供的删除订单的方法。

在Java中没有这样的方法。我对此问题的解决方案是使用Order作为另一个参数与Criteria一起传递给分页查询函数。

答案 4 :(得分:0)

如果您收到标准作为参数并使用它进行计算,则可以使用.Clone(),如下所示:

    private static int GetTotalRows(ICriteria criteria)
    {
        var countCriteria = (ICriteria)criteria.Clone();
        return Convert.ToInt32(countCriteria.SetProjection(Projections.RowCount()).UniqueResult());
    }

其他解决方案是使用ClearOrders删除所有订单列表。

    private static int GetTotalRows(ICriteria criteria)
    {
        criteria.ClearOrders();
        ...
    }

此致

答案 5 :(得分:0)

您无法从条件中删除订单。我的分页解决方案是将Order []作为参数传递给进行分页的方法。

只有当db是db2 as400或其他不允许在select count(*)内排序的数据库时,才必须这样做。