'LIMIT'是而不是由JPQL支持。以下是使用Criteria-API的示例代碼。
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Double> criteriaQuery = builder.createQuery(Double.class);
Root<Product> productRoot = criteriaQuery.from(Product.class);
criteriaQuery.select(builder.avg(productRoot.get("price")));
criteriaQuery.orderBy(builder.desc(productRoot.get("price"));
Double average = (Double)entityManager.createQuery(criteriaQuery).setMaxResults(100).getSingleResult();
或
Double average = (Double)entityManager.createQuery("select avg(p.price) from Product p order by p.price").setMaxResults(100).getSingleResult();
如果這不起作用,那麼必須去執行兩個查詢 - 選擇絕對下令記錄&然後取它們的平均值。
否則,如果可移植性不是問題,可以使用單個查詢來完成同樣的查詢RDBMS支持限制從數據庫中獲取的結果的數量。
好的,我使用2個查詢來實現它。 Hsql和H2似乎都不喜歡標準和hsql,因爲它通過同時使用avg()來使用順序。是否有可能使用Criteria API做子查詢? – suicide 2011-05-16 21:50:34
是的,對於Criteria API中的子查詢,請參閱http://stackoverflow.com/questions/4483576/jpa-2-0-criteria-api-subqueries-in-expressions/4668015#4668015。但是問題在於限制結果在JPA中用於子查詢。在休眠中,它可以通過query.setFetchSize(int fetchSize)完成。 – 2011-05-19 17:16:14