2009-08-27 9 views
75

Estoy tratando de escribir una consulta JPQL con una cláusula como:de parámetros en la cláusula como JPQL

LIKE '%:code%' 

me gustaría tener el código = 4 y encontrar

 
455 
554 
646 
... 

que no puede pasar :code = '%value%'

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

porque en otro lugar necesito :value no envuelto por el % caracteres ¿Alguna ayuda?

+2

@ Manuele Piastra: ¿La respuesta a continuación no es lo que estabas buscando? – wmorrison365

Respuesta

157

Si lo hace

LIKE :code 

y luego hacer

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

A continuación, el valor se mantiene libre de la señal '%'. Si necesita usarlo en otro lugar en la misma consulta, simplemente use otro nombre de parámetro que no sea 'código'.

+9

Para el registro, esto no lo deja abierto a los ataques de inyección de JPQL porque this.value se escapó automáticamente de manera adecuada para usted. –

+1

Este '"% "+ this.value +"% "' es lo que se escapó. – Gustavo

+0

¿Cómo hago esto insensible a las mayúsculas y minúsculas? –

50

No uso parámetros con nombre para todas las consultas. Por ejemplo, es inusual usar parámetros con nombre en JpaRepository.

Para solucionar utilizo JPQL CONCAT función (este código emular comienzo 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); 
} 

me encontré con esta técnica en excelentes documentos: http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html

4

Se podría utilizar el JPA LOCATE function.

LOCATE (searchString que, candidateString [, startIndex]): Devuelve el primer índice de searchString que en candidateString. Las posiciones están basadas en 1. Si no se encuentra la cadena, devuelve 0.

FYI: La documentación sobre my top google hit había invertido los parámetros.

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

para mí la mejor solución: sin concatenación, sin inyección SQL. – hgoebl

2

acaba de salir de la ''

LIKE %:code% 
0

No sé si llego tarde o fuera de su alcance, pero en mi opinión que podía hacerlo como:

String orgName = "anyParamValue"; 

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

q.setParameter("orgName", orgName); 
Cuestiones relacionadas