Java Hibernate 5.2标准查询子查询

Java Hibernate 5.2标准查询子查询,java,sql,oracle,hibernate,Java,Sql,Oracle,Hibernate,我有使用Hibernate 5.2 CriteriaBuilder的Java代码。 代码返回下面的SQL语句 爪哇 我想修改这段java代码,以便得到下面的sql语句 SELECT COUNT(*) FROM (SELECT * FROM TRANSACTIONS WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY) 请让我知道如何修改它 另外,在Hiber

我有使用Hibernate 5.2 CriteriaBuilder的Java代码。 代码返回下面的SQL语句

爪哇

我想修改这段java代码,以便得到下面的sql语句

 SELECT COUNT(*)
       FROM (SELECT *
               FROM TRANSACTIONS
              WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY)
请让我知道如何修改它

另外,在Hibernate3中,有这样一个选项可以将sql限制添加到标准中

criterionFilter =  Restrictions.and(criterionFilter, Restrictions.sqlRestriction("rownum <= ?", 1000, StandardBasicTypes.INTEGER))

在hibernate 5中是否可能?

考虑以下答案/问题:

在JPQL中不可能做到这一点。不幸的是,这是一个很大的限制。您应该考虑使用原生查询来执行此操作或像视图这样的其他方法。< /p> < p>生成的查询

 SELECT COUNT(*)
     FROM TRANSACTIONS
   WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY
完全没有意义,select count*只返回一行,因此没有理由将获取的行数限制为1000


因此,唯一正确的操作是由hibernate人员打开票据。同时,如果您得到的计数高于1000,请使用变通方法,简单地将其减少到1000。您将得到预期的结果。

是,但是,如果表中有10000000条记录用于此限制,它将检查所有记录,这将花费很长时间。如果我可以选择在hibernate 5.2谓词中添加rownum<1000,那么在这种情况下,操作会快得多。因为它将只检查1000行,然后停止。解决方法是仅获取前1000行,但它仅在从表not count获取记录时有效。所以我必须从select中再添加一个select计数。。。不幸的是,这是真的。但从更大的意义上讲,我知道,使用现有框架并不总是容易的,您根本不应该计算第一页中的行数。计数应该隐式地从第一页的获取数据中获得的行数派生。
criterionFilter =  Restrictions.and(criterionFilter, Restrictions.sqlRestriction("rownum <= ?", 1000, StandardBasicTypes.INTEGER))
 SELECT COUNT(*)
     FROM TRANSACTIONS
   WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY