with sentencias query namedquery inner example ejemplos create java jpa eclipselink jpql sql-like

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%