【问题标题】:Hibernate 5.2 CriteriaQuery SubqueryHibernate 5.2 CriteriaQuery 子查询
【发布时间】:2019-04-15 03:49:45
【问题描述】:

我有使用 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 Restriction 添加到“Criterion”

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

在hibernate 5中可以吗?

【问题讨论】:

    标签: java sql oracle hibernate


    【解决方案1】:

    考虑以下答案/问题:

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

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

    【讨论】:

      【解决方案2】:

      生成的查询

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

      提供绝对没有意义,select count(*) 只返回一行,因此没有理由将获取的行数限制为1000。

      因此,唯一正确的做法是由休眠人员开票。同时,如果您得到的count高于 1000,请使用解决方法,只需将其减少到 1000。您会得到预期的结果。

      【讨论】:

      • 是的,但是如果表中有 10000000 条记录针对此限制,它将检查所有记录,并且需要很长时间。如果我可以选择在hibernate 5.2“谓词”中添加rownum )。所以我必须在顶部再添加一个“select count() from (select...)”。
      • 很遗憾这是真的。但在更大的意义上(我知道现有框架并不总是那么容易)你根本不应该计算第一页中的行数。该计数应隐含地从第一页的获取数据中获得的行数得出。
      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2019-04-22
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多