2009-08-27 10 views
75

Sto cercando di scrivere una query JPQL con una clausola simile:Parametro dentro come clausola JPQL

LIKE '%:code%' 

Vorrei avere il codice = 4 e trovare

 
455 
554 
646 
... 

Non posso passare :code = '%value%'

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

perché in un altro luogo ho bisogno di :value non spostato dal % caratteri. Qualsiasi aiuto?

+2

@ Manuele Piastra: la risposta che segue non è ciò che stavi cercando? – wmorrison365

risposta

157

Se fai

LIKE :code 

e poi fare

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

Poi valore rimane libero dal segno '%'. Se è necessario utilizzarlo da qualche altra parte nella stessa query, utilizzare semplicemente un altro nome di parametro diverso da "codice".

+9

Per la cronaca, questo non ti lascia gli attacchi di iniezione JPQL perché this.value viene automaticamente scappato per te. –

+1

Questo '"% "+ this.value +"% "' è ciò che è sfuggito. – Gustavo

+0

Come si fa a non distinguere maiuscole e minuscole? –

50

Non uso parametri con nome per tutte le query. Ad esempio, è insolito utilizzare i parametri denominati in JpaRepository.

Per risolvere io uso JPQL CONCAT funzione (questo codice di emulare partenza con):

@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); 
} 

ho trovato questa tecnica in ottime docs: http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html

4

È possibile utilizzare il JPA LOCATE function.

locate (searchString, candidateString [, startIndex]): Restituisce il primo indice searchString in candidateString. Le posizioni sono basate su 1. Se la stringa non viene trovato, restituisce 0.

FYI: La documentazione relativa my top google hit aveva i parametri invertito.

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

per me la soluzione migliore: nessuna concatenazione, nessuna iniezione SQL. – hgoebl

2

semplicemente lasciare il ''

LIKE %:code% 
0

Non so se sono in ritardo o fuori del campo di applicazione, ma a mio parere ho potuto fare le cose come:

String orgName = "anyParamValue"; 

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

q.setParameter("orgName", orgName);