2016-07-28 28 views
1

我需要獲取兩個字段之間最大最小的值。我正在使用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(),(值)沒有任何意義。

我在這裏做錯了什麼?

+0

我的建議是看這個[SO問題](http://stackoverflow.com/questions/35759093/jpa- criteriaquery-with-least-and-most-functions),它們詳細介紹了使用CriteriaBuilder實現你正在尋找的內容。 –

+0

@JustinKyleParton謝謝。這將是我最糟糕的情況解決方案。我試圖避免將此查詢重寫到CriteriaBuilder中。 – dazito

+0

我還沒有使用過這個,所以我不會把它作爲答案,但轉到此頁[EclipseLink Special Operators](https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#EclipseLink_special_operators)並嘗試使用它來實現你想要的。另請看下面的操作符 –

回答

0

我結束了以下解決方案中,MIN/MAXCASE THEN

這裏的混合的查詢:

SELECT 
MIN(CASE WHEN (c.min < mc.min) THEN mc.min ELSE c.min END) as min, 
MAX(CASE WHEN (c.max < mc.max) THEN c.max ELSE mc.max END) as max 
FROM ... 
1

JPA 2.0不支持聚合函數greatestleast。他們沒有在syntax中提及。您是否嘗試過minmax而不是:max(c.min,mc.min), min(c.max,mc.max)

1

另一種選擇可能是增加對MySQL的數據庫JPA方言。我不熟悉的EclipseLink,但與Hibernate會是這樣的:

import org.hibernate.dialect.MySQL5InnoDBDialect; 
import org.hibernate.dialect.function.StandardSQLFunction; 

public class CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect { 
    public CustomMySQL5InnoDBDialect() { 
     super(); 

     registerFunction("greatest", new StandardSQLFunction("greatest", null)); 
     registerFunction("least", new StandardSQLFunction("least", null)); 
    } 
} 
+0

我沒有試過這個,因爲我解決了我的問題,我沒有時間重構/嘗試這種方法,但這看起來像是一個有趣的解決方案。 +1 – dazito