【问题标题】:What is the best way to limit results using a DetachedCriteria of Hibernate in Java?在 Java 中使用 Hibernate 的 DetachedCriteria 限制结果的最佳方法是什么?
【发布时间】:2012-07-16 15:50:11
【问题描述】:

我在 Java 中使用 Hibernate 3.5.6-Final。由于我无法访问 Hibernate Session,因此我使用的是 DetachedCriteria。所以,我想知道限制 DetachedCriteria 结果的最佳方法是什么(在我的情况下,我只想获得第一行)。

附加信息:

Criteria 类有一些方法可以实现这一点,例如 setMaxResults(int maxResults)setFirstResult(int firstResult),但 DetachedCriteria 两者都没有。同样,我无法使用 Criteria,因为我无权访问 Hibernate 的 Session。

【问题讨论】:

    标签: java hibernate orm detachedcriteria


    【解决方案1】:

    如果您使用的是休眠模板,则有一个findByCriteria(criteria, firstResult, maxResults)。不鼓励使用模板,但对于那些使用遗留代码的人来说,这是可用的。

    【讨论】:

    • 最佳答案
    【解决方案2】:

    您可以使用Restrictions.sqlRestriction() 将纯 SQL 表达式添加到 DetachedCriteria。试试这个:

    DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
      .add(Restrictions.sqlRestriction("LIMIT 1"));
    

    【讨论】:

    • 这不适用于 mysql 案例。我观察到“限制 1”在 WHERE 子句中显示为条件,这不是有效的 sql 语句。
    • 解决方法是将DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class) .add(Restrictions.sqlRestriction("1=1 LIMIT 1"));
    • 至少 PostgreSQL 要求 LIMIT 语句在物理上位于 ORDER BY 后面。这种方法将它插入到WHEREORDER BY 之间,如果您指定的话。但是,如果您没有对结果进行排序,如何获得一致的结果?
    【解决方案3】:

    扩展 yorkw 的答案,Oracle 等价物是:

    DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
      .add(Restrictions.sqlRestriction("rownum < 1"));
    

    它将行限制添加到子查询中的“where”子句中。

    【讨论】:

      【解决方案4】:

      这就是我的做法,您必须将结果包装到执行块中。 下例中的 EntityMAnager 是 org.springframework.orm.hibernate3.HibernateOperations 对象:

      final DetachedCriteria criteria = DetachedCriteria.forClass(ActivePropertyView.class);
      criteria.add(Restrictions.eq("featured", true));
      List<ActivePropertyView> result = entityManager.execute(
           new HibernateCallback<List<ActivePropertyView>>() {
               @Override
               public List<ActivePropertyView> doInHibernate(Session session) 
                                               throws HibernateException,SQLException {
                       return criteria.getExecutableCriteria(session).setMaxResults(5).list();
               }
           });
      return result;
      

      【讨论】:

      • 似乎这种方法是最好的,因为DetachedCriteria 总是会到达 Hibernate Session 所在的存储库层。谢谢!
      • 这个只有当它有单个对象时才能正常工作。如果这个分离的对象有关联并且该关联有多个记录怎么办。这个 MaxResults(1) 只获取关联对象,即使它有更多结果
      【解决方案5】:
      detachedCriteria.getExecutableCriteria(getSession()).setMaxResults(1);
      

      【讨论】:

        【解决方案6】:

        如果我正确阅读了 javadoc,则在最终将 DetachedCriteria 转换为真正的 Criteria 之前,您无法限制(当您确实有 Session 时)

        【讨论】:

        • 感谢您修改我的阻塞点,但我仍然想知道怎么做。似乎@iririr 给出的答案是目前处理这种情况的最佳方法。
        • 为什么不使用您自己的 ExtendedDetachedCriteriaClass 扩展 Criteria 并添加限制和偏移量。然后在您实际进行会话时设置它们。
        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-21
        • 2013-03-17
        相关资源
        最近更新 更多