2009-08-27 13 views
75

Ich versuche, eine JPQL Abfrage mit einer ähnlichen Klausel zu schreiben:Parameter in wie Klausel JPQL

LIKE '%:code%' 

Ich mag würde Code haben = 4 und finden

 
455 
554 
646 
... 

Ich kann nicht passieren :code = '%value%'

namedQuery.setParameter("%" + this.value + "%"); 

weil an einem anderen Ort brauche ich :value nicht von derverpacktZeichen. Irgendeine Hilfe?

+2

@ Manuele Piastra: Ist die Antwort unten nicht das, wonach Sie gesucht haben? – wmorrison365

Antwort

157

Wenn Sie

tun
LIKE :code 

und tun dann

namedQuery.setParameter("code", "%" + this.value + "%"); 

Dann Wert bleibt von dem '%' Zeichen frei. Wenn Sie es an anderer Stelle in derselben Abfrage verwenden müssen, verwenden Sie einfach einen anderen Parameternamen als "code".

+9

Zur Erinnerung, dies lässt Sie nicht offen für JPQL-Injection-Angriffe, weil this.value automatisch richtig für Sie entkommt. –

+1

Dieser '"% "+ this.value +"% "' ist was es gibt. – Gustavo

+0

Wie mache ich das Case-insensitive? –

50

Ich verwende keine benannten Parameter für alle Abfragen. Zum Beispiel ist es ungewöhnlich, benannte Parameter in JpaRepository zu verwenden.

Ich benutze JPQL CONCAT Funktion Umgehung (dieser Code emulieren Start mit):

@Repository 
public interface BranchRepository extends JpaRepository<Branch, String> { 
    private static final String QUERY = "select b from Branch b" 
     + " left join b.filial f" 
     + " where f.id = ?1 and b.id like CONCAT(?2, '%')"; 
    @Query(QUERY) 
    List<Branch> findByFilialAndBranchLike(String filialId, String branchCode); 
} 

ich diese Technik in sehr gutem docs gefunden: http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html

4

Sie die JPA LOCATE function nutzen könnten.

LOCATE (searchString-, candidateString [, start]): Gibt den ersten Index von searchString- in candidateString. Positionen sind 1-basiert. Wenn die Zeichenkette nicht gefunden wird, gibt 0.

Zur Info: Die Dokumentation auf my top google hit hatte die Parameter umgekehrt.

SELECT 
    e 
FROM 
    entity e 
WHERE 
    (0 < LOCATE(:searchStr, e.property)) 
+0

für mich die beste Lösung - keine Verkettung, keine SQL-Injektion. – hgoebl

2

Lassen Sie einfach aus der ‚‘

LIKE %:code% 
0

Ich weiß nicht, ob ich bin spät oder außerhalb des Bereichs, aber meiner Meinung nach ist es wie ich tun konnte:

String orgName = "anyParamValue"; 

Query q = em.createQuery("Select O from Organization O where O.orgName LIKE '%:orgName%'"); 

q.setParameter("orgName", orgName);