2016-04-28 278 views
0

我使用Spring引導與JPA(EclipseLink的)和Oracle 11 我有CrudRepository接口:春天JPA共創雙括號查詢

public interface TransportDefRepository extends CrudRepository<TransportDef, Long> { 
    public List<TransportDef> findByNameInOrderByNameAsc(List<String> names); 
} 

調用findByNameInOrderByNameAsc方法創建查詢:

SELECT ID, NAME, 
FROM TRANSPORT_DEFS WHERE (NAME IN (('A','B'))) ORDER BY NAME ASC 

甲骨文拋出異常:

ORA-00907: missing right parenthesis 

我是幹什麼的有什麼問題? 爲什麼在生成的查詢中有雙括號?

+1

那麼,你可能會檢查你的方言至少設置爲'Oracle10gDialect',但似乎有很多關於這個錯誤的報告。 –

+0

你能提供生成的真實查詢嗎? –

+1

NAME後真的有逗號嗎? –

回答

1

我的解決辦法:

@Query("select t from TransportDef t where t.name in ?1 order by t.name asc") 
public List<TransportDef> findByNameInOrderByNameAsc(List<String> names); 

隨着@Query註釋的EclipseLink創建查詢:

SELECT ... FROM TRANSPORT_DEFS WHERE (NAME IN (?,?,?)) ORDER BY NAME ASC 

這是唯一的解決辦法 - 我不知道爲什麼春天JPA的數據沒有這個註釋產生無效的查詢......

-2

我不太確定,特別是你需要通過一個列表來查詢你的表,但如果我是你,我會以不同的方式進行編碼。

1.替代傳遞列表作爲參數,我會傳遞參數。並在服務層上執行 列表名稱迭代,並仍然從您的回購列表中返回列表。所以我在我的回購代碼將如下

@Query("SELECT t FROM TRANSPORT_DEFS t WHERE t.name = :name) 
List<TransportDef> findByNameInOrderByNameAsc(@Param("name") String name); 

這將工作,你只需要調整你的服務的邏輯。

+3

有沒有必要自己寫這個查詢。 Spring Data JPA應該爲你生成它.. –

+2

因此,你會執行潛在的大量查詢而不是1? –

+0

@AlanHay我爲什麼要發送一個列表到我的數據庫。而我可以根據特定條件處理我的服務邏輯 – Rudy