【问题标题】:count(*) in hibernate criteria?休眠条件中的计数(*)?
【发布时间】:2010-01-29 06:20:10
【问题描述】:

我有一个使用休眠条件实现的搜索条件组合。 我添加了这样的分页:

criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();

这对于分页来说是不够的,所以我计算了总的结果大小。

totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();

问题是,我第一次提交搜索表单时,得到了正确的 totalResult。 当我单击下一页并且偏移量发生变化时,我在第二条语句处得到了 NullPointExcetion。我不知道为什么。并且通过调试可以看到,当这个异常发生时,第一条语句成功返回了分页结果。

所以我想问一下,第一个语句是否与第二个语句冲突? (因为第一个语句将 fetchsize 设置为 10 ,我想知道 count(*) 函数是否会正常工作。 它们是使用相同标准的不同任务,我如何克隆或复制一个已经添加了许多限制的标准?)

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    只是为了修复 count(*) 查询 - 最好将此代码用于条件:

    Integer totalResult = ((Number)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
    

    否则会报错java.lang.Long cannot be cast to java.lang.Integer

    【讨论】:

    • 没有演员表的好方法:Integer totalCount = criteria.setProjection(Projections.rowCount()).uniqueResult().hashCode();。你会得到同样的结果。
    • 绝招!直到我看到你的评论并查看了jdk源代码才意识到这一点。
    • 我不确定我是否相信你的巧妙技巧(尽管我印象深刻)。 hashCode() 合约规定哈希码不必从一次运行到下一次保持不变,因此 Oracle 完全有权更改 hashCode() 方法,尽管可能性不大。不过,我宁愿只调用 intValue()。
    【解决方案2】:

    我认为冲突实际上是计数查询中的限制,所以我希望它在第二次运行分页查询时返回错误的结果。

    对两者都使用一个标准需要在使用之间进行一些重置,这可能可以按照以下方式完成:

     criteria.setProjection(null)
             .setResultTransformer(Criteria.ROOT_ENTITY);
    

    如果你真的想要两个独立但相同的标准,我认为最简单的方法是首先创建一个可序列化的 DetachedCriteria,然后使用序列化-反序列化克隆 hack 制作另一个,然后通过附加将它们转换为普通标准参加会议。

    但如果你可以在重置中工作,你可能不需要两个。

    【讨论】:

    • 谢谢,其实我的解决方案和你的回答完全一样。它有效!
    猜你喜欢
    • 2017-12-25
    • 2011-06-30
    • 2019-02-19
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多