我有使用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中有可能吗?
答案 0 :(得分:0)
考虑以下答案/问题:
在JPQL中无法做到这一点。不幸的是,这是一个强大的限制。您应该考虑使用本机查询或其他方法(例如视图)来完成此操作。
答案 1 :(得分:0)
生成的查询
SELECT COUNT(*)
FROM TRANSACTIONS
WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY
完全没有意义,select count(*)
仅返回一行,因此没有理由将获取的行数限制为1000 。
因此,唯一正确的措施是由休眠状态的人打开票。同时,如果您得到的count
高于1000,请使用解决方法。将其简化为1000。可以得到预期的结果。