sentencias - jpql en java
Parámetro en cláusula similar JPQL (5)
Estoy tratando de escribir una consulta JPQL con una cláusula similar:
LIKE ''%:code%''
Me gustaría tener el código = 4 y encontrar
455 554 646 ...
No puedo pasar :code = ''%value%''
namedQuery.setParameter("%" + this.value + "%");
porque en otro lugar necesito :value
no envuelto por el %
caracteres. ¿Alguna ayuda?
No sé si llego tarde o si estoy fuera de mi alcance, pero en mi opinión podría hacerlo así:
String orgName = "anyParamValue";
Query q = em.createQuery("Select O from Organization O where O.orgName LIKE ''%:orgName%''");
q.setParameter("orgName", orgName);
No uso parámetros nombrados para todas las consultas. Por ejemplo, es inusual usar parámetros nombrados en JpaRepository .
Para solucionarlo, utilizo la función JPQL CONCAT (este código emula el 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);
}
Encontré 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
Puede usar la función JPA LOCATE .
LOCATE (searchString, candidateString [, startIndex]) : devuelve el primer índice de searchString en candidateString. Las posiciones están basadas en 1. Si la cadena no se encuentra, devuelve 0.
FYI: La documentación en mi top google hit tenía los parámetros invertidos.
SELECT
e
FROM
entity e
WHERE
(0 < LOCATE(:searchStr, e.property))
Si lo haces
LIKE :code
y luego hacer
namedQuery.setParameter("code", "%" + this.value + "%");
Entonces el valor permanece libre del signo ''%''. Si necesita usarlo en otro lugar en la misma consulta, simplemente use otro nombre de parámetro que no sea ''código''.
Solo deja de lado el ''''
LIKE %:code%