我需要獲取兩個字段之間最大最小的值。我正在使用JPA 2.1和EclipsLink。JPA - 語法錯誤解析SELECT GREATEST(c.field,mc.field),LEAST(c.field,mc.field)FROM表
,這裏是我的查詢簡化爲:
SELECT GREATEST(c.min, mc.max), LEAST(c.max, mc.max)
FROM
MethodCategory mc, OperationMethod om, Client c
JOIN
User u ON c.id = u.client.id
WHERE
om.method = 1
AND om.method.category = "SUPER"
AND om.isDeleted = false
AND om.user = u
AND u.id <> 1
AND c.isOnline = TRUE
AND c.isActive = TRUE;
它還對MySQL工作臺做工精細,作爲原始的SQL查詢,但是當我複製此查詢到我的entityManager.createQuery(query)
我得到一個異常。
以下是我複製查詢JPA:
TypedQuery<Object[]> query = em.createQuery("SELECT GREATEST(c.min, mc.min), LEAST(c.max, mc.max) "
+ " FROM\n"
+ " MethodCategory mc, OperationMethod om, Client c \n"
+ " JOIN\n"
+ " User u ON c.id = u.client.id \n"
+ " WHERE\n"
+ " om.method = :method \n"
+ " AND om.method.category = :categoryName \n"
+ " AND om.isDeleted = false \n"
+ " AND om.user = u \n"
+ " AND u.id <> :userId \n"
+ " AND c.isOnline = TRUE \n"
+ " AND c.isActive = TRUE \n",
Object[].class);
每當我執行此JPQL查詢我得到這個異常:
Exception Description: Syntax error parsing [SELECT GREATEST(c.min, mc.min), LEAST(c.max, mc.max) FROM (...)
[14, 15] The SELECT clause has 'GREATEST' and '(c.min, mc.min)' that are not separated by a comma.
[72, 73] The SELECT clause has 'LEAST' and '(c.max, mc.max)' that are not separated by a comma.
這真的是沒有意義的我這個例外。我清楚地用逗號和GREATEST分隔了GREATEST()和LEAST(),(值)沒有任何意義。
我在這裏做錯了什麼?
我的建議是看這個[SO問題](http://stackoverflow.com/questions/35759093/jpa- criteriaquery-with-least-and-most-functions),它們詳細介紹了使用CriteriaBuilder實現你正在尋找的內容。 –
@JustinKyleParton謝謝。這將是我最糟糕的情況解決方案。我試圖避免將此查詢重寫到CriteriaBuilder中。 – dazito
我還沒有使用過這個,所以我不會把它作爲答案,但轉到此頁[EclipseLink Special Operators](https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#EclipseLink_special_operators)並嘗試使用它來實現你想要的。另請看下面的操作符 –