hibernate – 如何在DetachedCriteria中设置最大结果?

我正在使用DetachedCriteria,我只想要查询的第一个结果,所以我想做一些像DetachedCriteria中的LIMIT 1.当我搜索谷歌时,我发现了setMaxResult但它的标准.

我怎么在DetachedCriteria中做到这一点?

最佳答案 我也只是在研究这个问题.我不喜欢必须使用标准的解决方案,因为DetachedCriteria的整个目的是在你还没有Session时定义它.

在我正在处理的应用程序中,这也不是一个选项,因为创建DetachedCriteria的地方远不是实际执行的地方.

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

唯一的问题是Hibernate已经构建了sql字符串,并且已经在查询字符串中添加了一个“和”,因为它期待一个比较语句.但我们可以通过返回’1 = 1’来伪造这个.

请参阅下面的LimitBy Criterion的实现.

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,并未在其他数据库上进行测试,但我希望它也适用于其他数据库.当某个数据库不起作用时的响应.

点赞