2015-06-26 7 views
7

Mam następujące zapytanie JPQL:JPQL: rzucają długie String wykonać podoba Szukaj

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) 

klient chce, abyśmy byli w stanie wyszukać być pole nbr, który jest java.lang.Long.

Q:

Jak wykonać podoba Szukaj na java.lang.Long wykorzystaniem JPQL?

+1

Ty nie. LIKE jest tylko dla Strings, jak na JPQL BNF http://www.datanucleus.org/products/accessplatform_4_2/jpa/jpql.html#JPQL_BNF_Notation –

+0

Czy nie ma sposobu, aby rzucić to na ciąg lub w inny sposób wywołać 'toString() '? – Kawu

+0

czy próbowałeś TREAT? –

Odpowiedz

3

Można użyć CAST w HQL:

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) 

Ale można mieć poważne problemy z wydajnością w ten sposób, ponieważ baza danych nie będzie można korzystać z indeksu nbr (jeśli nbr kolumna jest indeksowana).

+0

Szkoda, że ​​pytanie było wyraźnie o JPQL, a nie HQL ... używamy różnych dostawców JPA ... – Kawu

+0

Mój błąd, @Kawu. Zapytanie natywne jest dla Ciebie odpowiednią opcją? Czy myślisz o utworzeniu nowej kolumny z 'nbr' jako typem VARCHAR? – Dherik

0

proste .. CAST(field as text/varchar) LIKE To musi być typem wie o bazy danych (nie strun jak w HQL)

i patrząc w zapytaniu jest bardziej efektywny sposób to zrobić:

z CONCAT nie trzeba rzucać argumenty NON String (gdy istnieje więcej niż jeden, a co najmniej jeden jest String)

to działa: DOLNA (CONCAT (nazwisko, NBR, opis)), jak

to nie: CONCAT (NBR), chyba dlatego, że nie rozpoznaje CONCAT funkcji JPQL (Long ..)