【问题标题】:Hibernate equivalent for pagination queries分页查询的 Hibernate 等效项
【发布时间】:2014-05-08 22:14:53
【问题描述】:

我有一个这样的带有分页支持的查询,

select *
from (select distinct field1
from table
where field2 = 'some_value'
and filed3 > 'somevalue'
and field4 in('somevalues')
and field5 is null order by field1)
where ROWNUM <= <page_size> ;

我如何在 hibernate 中同样表示。我不想手动构造查询。相反,我希望在 hibernate 中设置与上述查询匹配的条件。

【问题讨论】:

    标签: mysql sql hibernate pagination hibernate-mapping


    【解决方案1】:

    使用标准 API 中的第一个结果和最大结果。链接here

    Criteria queryCriteria = session.createCriteria(YourClass.class);
    queryCriteria .setProjection(Projections.distinct(Projections.property("id")));
    queryCriteria.setFirstResult(10);
    queryCriteria.setMaxResults(20);
    queryCriteria.add(Restrictions.eq( "propertyOne", 10));  //Add restrictions here
    List data = queryCriteria.list();
    

    上面的查询会给你记录 10-20

    【讨论】:

    • 这将如何工作?内部查询会先执行然后限制 page_size 吗? .所以内部查询将返回100行。外部查询将根据页面大小对其进行过滤。
    • 这里不需要子查询。我将编辑答案以包含不同的结果。 Hibernate 将生成正确的 sql 以便您可以限制行,在这种情况下不需要额外的子查询或 in 子句。
    • 在获取符合条件的行后应用 Distinct。因此,如果您将 maxresults 设置为相同的条件,它将首先获取 20 行,如果应用 distinct 之后,假设我们得到 3 行..ly 将返回 3 行,因为页面大小为 20。这就是我进行内部和外部查询的原因。所以内部查询的作用是,它会获取字段 3 > 'somevalue' 的所有行。说有100 行。然后当它应用不同时,假设我们得到 50 行。所以现在外部查询只返回 20,这是页面大小。
    • 看看这篇文章,然后看看 DetatchedCriteria 示例:stackoverflow.com/questions/300491/…
    • 外部查询只是限制了行数。我该如何设置呢?我很清楚创建分离标准,但我将如何在主要标准中设置这个分离标准?代码示例会有所帮助。
    【解决方案2】:
    criteria.setMaxResults(pageSize);
    criteria.setFirstResult((pageNumber) * 10)
    

    【讨论】:

    • 您给出的建议将使查询看起来像,从表中选择不同的 field1,其中 field2 = 'some_value' and filed3 > 'somevalue' and field4 in('somevalues') and field5 is null order按字段 1,其中 rownum
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多