2015-06-26 60 views
7

執行我有以下JPQL查詢:JPQL:投給長字符串LIKE搜索

SELECT il 
FROM InsiderList il 
WHERE (il.deleteFlag IS NULL OR il.deleteFlag = '0') 
    AND il.clientId = :clientId 
    AND ( LOWER(il.name) LIKE :searchTerm 
     OR il.nbr LIKE :searchTerm 
     OR LOWER(il.type) LIKE :searchTerm 
     OR LOWER(il.description) LIKE :searchTerm) 

客戶希望我們能夠搜索是nbr場,這是一個java.lang.Long

Q

你如何進行使用JPQL一個java.lang.Long LIKE搜索?

+1

你不知道。 LIKE僅針對字符串,按照JPQL BNF http://www.datanucleus.org/products/accessplatform_4_2/jpa/jpql.html#JPQL_BNF_Notation –

+0

是否沒有辦法將其轉換爲字符串或其他方式來調用'toString ()'? – Kawu

+0

你試過TREAT嗎? –

回答

3

您可以使用HQL的CAST

SELECT il 
FROM InsiderList il 
WHERE (il.deleteFlag IS NULL OR il.deleteFlag = '0') 
    AND il.clientId = :clientId 
    AND ( LOWER(il.name) LIKE :searchTerm 
     OR CAST(il.nbr as string) LIKE :searchTerm 
     OR LOWER(il.type) LIKE :searchTerm 
     OR LOWER(il.description) LIKE :searchTerm) 

但你可以有這樣嚴重的性能問題,因爲該數據庫將無法使用nbr指數(如果nbr列索引)。

+0

太糟糕了,問題顯然是關於JPQL而不是HQL ......我們正在使用各種JPA提供程序...... – Kawu

+0

我的錯誤@Kawu。原生查詢是您的一個選擇?你是否想用'nbr'創建一個新的列作爲VARCHAR類型? – Dherik

0

簡單.. CAST(field as text/varchar) LIKE 它必須是一個類型知悉數據庫(不像HQL)

而且在查詢看有一種更有效的方式做到這一點:

隨着CONCAT你沒有投非字符串參數(如果有一個以上的至少一個是字符串)

此作品:LOWER(CONCAT(姓名,NBR,說明))LIKE

這不:CONCAT(NBR),我猜是因爲它不承認一個JPQL功能CONCAT(長..)