Hibernate 5.2 CriteriaQuery子查询

时间:2018-11-12 12:10:04

标签: java sql oracle hibernate

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

(JAVA)

   CriteriaBuilder countBuilder = session.getCriteriaBuilder();
   CriteriaQuery<Long> criteriaCount = builder.createQuery(Long.class);
   Root<Transaction> transactions = criteriaCount.from(Transaction.class);
   criteriaCount.select(builder.count(transactions));
   criteriaCount.where(generatePredicate(tRequest, countBuilder, transactions, dateFrom, dateTo));
   count = session.createQuery(criteriaCount).setMaxResults(rowNum).getSingleResult();

(SQL)

 SELECT COUNT(*)
     FROM TRANSACTIONS
   WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY

我想修改此Java代码,以便在下面获得此sql语句

 SELECT COUNT(*)
       FROM (SELECT *
               FROM TRANSACTIONS
              WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY)

请让我知道如何对其进行修改。

此外,在Hibernate 3中,可以这样选择将sql限制添加到“ Criterion”中

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

在休眠5中有可能吗?

2 个答案:

答案 0 :(得分:0)

考虑以下答案/问题:

  1. Refactor native query to JPQL query
  2. JPA/hibernate subquery in from clause

在JPQL中无法做到这一点。不幸的是,这是一个强大的限制。您应该考虑使用本机查询或其他方法(例如视图)来完成此操作。

答案 1 :(得分:0)

生成的查询

 SELECT COUNT(*)
     FROM TRANSACTIONS
   WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY

完全没有意义,select count(*)仅返回一行,因此没有理由将获取的行数限制为1000

因此,唯一正确的措施是由休眠状态的人打开票。同时,如果您得到的count高于1000,请使用解决方法。将其简化为1000。可以得到预期的结果。