% Like% Query en Spring JpaRepository


110

Me gustaría escribir una consulta similar JpaRepositorypero no devuelve nada:

LIKE '%place%'-no funciona.

LIKE 'place' funciona perfectamente.

Aquí está mi código:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

Respuestas:


199

La consulta JPA de datos de primavera necesita los caracteres "%", así como un carácter espacial a continuación likeen su consulta, como en

@Query("Select c from Registration c where c.place like %:place%").

Cf. http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

Es posible que desee deshacerse de la @Queryanotación por completo, ya que parece parecerse a la consulta estándar (implementada automáticamente por los proxies de datos de Spring); es decir, usando una sola línea

List<Registration> findByPlaceContaining(String place);

es suficiente.


23
También puede ser útil ignorar el uso de mayúsculas y minúsculas para una consulta, utilizando: findByPlaceIgnoreCaseContaining (String place);
ilyailya

Solo como un comentario lateral, no puede mezclar y combinar%: param% con% param% dentro de la misma consulta. De lo contrario, la aplicación ni siquiera se iniciará.
RVP

Gracias. Solía ​​escribir like '%:place%'con 'y no hubo ningún resultado, porque Hibernate agrega 's a las cadenas por sí mismo.
Yamashiro Rion

Esta no es una buena respuesta y también es potencialmente peligrosa. Spring tiene esto resuelto con ContainingIgnoreCase, verifique mi respuesta a continuación.
Alexius DIAKOGIANNIS

99

En realidad, no necesita la @Queryanotación en absoluto.

Puedes usar lo siguiente

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Para mi esta es la mejor solución. No sabía que podía usar IgnoreCase combinado con Containing, no está en la documentación.
Wilson Campusano

1
¿Qué pasa con el caso cuando quiero usar muchas columnas? - Creo que @Query()es imprescindible, ¿verdad? Con ese enfoque, tendría que hacer orque en realidad no sea una solución adecuada para ese caso:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

También puede implementar las consultas similares utilizando la palabra clave "Containing" compatible con Spring Data JPA .

List<Registration> findByPlaceContaining(String place);

20

Para su caso, puede utilizar directamente los métodos JPA. Eso es como un bramido:

Contiene: seleccione ... como%: lugar%

List<Registration> findByPlaceContainingIgnoreCase(String place);

aquí, IgnoreCase le ayudará a buscar elementos ignorando el caso.

Usando @Query en JPQL :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

A continuación, se muestran algunos métodos relacionados:

  1. Me gusta findByPlaceLike

    ... donde x.place como? 1

  2. Empezando con findByPlaceStartingWith

    ... donde x.place like? 1 (parámetro enlazado con% agregado)

  3. Terminando con findByPlaceEndingWith

    ... donde x.place like? 1 (parámetro enlazado con% antepuesto)

  4. Conteniendo findByPlaceContaining

    ... donde x.place como? 1 (límite de parámetro envuelto en%)

Más información, vea este enlace , este enlace y este

Espero que esto te ayudará :)


6

Puede tener una alternativa de usar marcadores de posición como:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

Prueba esto.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

Útil si usamos something=:placey another like %:place%en consulta.
hong4rc

1

cuando llamo a la función, uso: findByPlaceContaining("%" + place);

o: findByPlaceContaining(place + "%");

o: findByPlaceContaining("%" + place + "%");


1

la respuesta exactamente será

-> `@Query (" seleccione u de la Categoría u donde u.categoryName como%: input% ")
     List findAllByInput (@Param ("input") String input);

0

Encontré una solución sin @Query(en realidad probé cuál es "aceptado". Sin embargo, no funcionó).

Tienes que regresar en Page<Entity>lugar de List<Entity>:

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase parte fue fundamental para lograr esto!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.