【问题标题】:hibernate - How to set max result in DetachedCriteria?hibernate - 如何在 DetachedCriteria 中设置最大结果?
【发布时间】:2012-07-23 02:46:01
【问题描述】:

我正在使用DetachedCriteria,我只想要查询的第一个结果,所以我想在DetachedCriteria 中执行类似LIMIT 1 的操作。当我搜索谷歌时,我发现setMaxResult 但它的标准。

DetachedCriteria 我该怎么做?

【问题讨论】:

标签: hibernate detachedcriteria


【解决方案1】:

我也在研究这个。我不喜欢必须使用标准的解决方案,因为 DetachedCriteria 的整个目的是在您还没有 Session 时定义它。 在我处理的应用程序中,这也不是一个选项,因为创建 DetachedCriteria 的位置与实际执行的位置相去甚远。

无论如何,我发现这个巧妙的技巧能够在创建 DetachedCriteria 时定义限制。 DetachedCriteria 采用 Criterion 实例,但 Criterion 使用实际的 Criteria(和 CriteriaQuery)回调,因此您可以在那时设置 maxResults。

唯一的问题是 Hibernate 已经在构造 sql 字符串并且已经在查询字符串中添加了一个 'and ',因为它需要一个比较语句。但是我们可以通过返回 '1 = 1' 来伪造它。

请参阅下面的 LimitBy 标准的实现。

public class Limit {
        private Limit() {}

        public static LimitBy by(int maxResults) {
            return new LimitBy(maxResults);
        }

        static class LimitBy implements Criterion {
            private int max;

            public LimitBy(int max) {
                this.max = max;
            }

            @Override
            public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
                criteria.setMaxResults(max);
                return "1 = 1";
            }

            @Override
            public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
                return new TypedValue[0];
            }
        }
    }

因此,有了这个 LimitBy 类,现在可以使用

限制 DetachedCriteria
DetachedCriteria.forClass(..)
  .add(Limit.by(1));

现在,这只返回查询的第一个结果。

这适用于 Postgres,未在其他数据库上进行测试,但我希望它也适用于其他数据库。某些数据库无法正常工作时的响应。

【讨论】:

  • 除了多余的嵌套类之外,这是一种智能、简单、安全的解决方案。在 PostgreSQL 上测试。
  • 你嵌套类的任何原因?
  • 在会话模式下也不起作用。极限出不来。 1=1 确实如此。在 PostgreSQL 中
【解决方案2】:

您可以使用 CRITERIA API

detachedcrit.getExecutableCriteria(session).SetMaxResults(1) 

【讨论】:

  • 重点是在您还没有会话时使用 DetachedCriteria,因此您的解决方案在这种情况下不起作用。
  • 在会话模式下也不起作用。限制没有出来。
【解决方案3】:

@Joost den Boer 发布的解决方案对我不起作用,但我找到了使用类似方法的解决方法:

public class PageRestrictions {

    public static class Page implements Criterion {

        private Integer limit;

        private Integer offset;

        private Order order;

        public Page offset(Integer offset) {
            this.offset = offset;
            return this;
        }

        public Page limit(Integer limit) {
            this.limit = limit;
            return this;
        }

        public Page by(Order order) {
            this.order = order;
            return this;
        }

        @Override
        public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {

            StringBuilder builder = new StringBuilder("1=1");

            if (this.order != null) {
                builder.append(" order by ").append(this.order.toSqlString(criteria, criteriaQuery));
            }

            if (this.offset != null) {
                builder.append(" offset ").append(this.offset);
            }

            if (this.limit != null) {
                builder.append(" limit ").append(this.limit);
            }

            return builder.toString();
        }

        @Override
        public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
            return new TypedValue[0];
        }
    }

    public static Page offset(Integer offset) {
        Page page = new Page();
        page.offset(offset);
        return page;
    }

    public static Page limit(Integer limit) {
        Page page = new Page();
        page.limit(limit);
        return page;
    }

    public static Page by(Order order) {
        Page page = new Page();
        page.by(order);
        return page;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多