2011-05-15 64 views
2

我想通過JPA2獲得我的前100名產品的平均價格。查詢應該看起來像這樣(我的sql有點生疏):限制在JPQL的子查詢中

select avg(price) from (
     select p.price from Product p order by p.price desc limit 100) 

但這根本不起作用。我也試過這個:

select avg(p.price) from Product p where p.id = 
     (select pj.id from Product pj order by pj.price desc limit 100) 

這是直到limit關鍵字。

我讀過限制在JPQL中不可用。

任何想法如何做到這一點?標準也沒有問題。

回答

5

'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支持限制從數據庫中獲取的結果的數量。

+0

好的,我使用2個查詢來實現它。 Hsql和H2似乎都不喜歡標準和hsql,因爲它通過同時使用avg()來使用順序。是否有可能使用Criteria API做子查詢? – suicide 2011-05-16 21:50:34

+0

是的,對於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

0
SELECT AVG(SELECT PRICE FROM PRODUCT ORDER BY PRICE DESC LIMIT 100) 

看到這個post關於JPQL LIMIT的工作。

+0

這不起作用。它只是給我一個SQL異常,說它是一個表達式的無效順序。順便說一句,我正在使用hsql。 好的,工作需要2分貝的查詢權利? – suicide 2011-05-15 22:14:22

+0

在您的問題中,您通過價格訂購一個查詢,另一個通過購買訂購。您的產品表上是否有購買專欄? – garnertb 2011-05-15 22:17:27

+0

抱歉我的錯誤,它應該總是按價格排序。我糾正了它。 – suicide 2011-05-15 22:21:44