% Like% Query in spring JpaRepository


110

Eu gostaria de escrever uma consulta similar, JpaRepositorymas não está retornando nada:

LIKE '%place%'-não está funcionando.

LIKE 'place' funciona perfeitamente.

Aqui está o meu 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);
}

Respostas:


199

A consulta JPA de dados de primavera precisa dos caracteres "%", bem como um caractere de espaço seguindo likeem sua consulta, como em

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

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

Você pode querer se livrar @Querytotalmente da anotação, pois ela parece se assemelhar à consulta padrão (implementada automaticamente pelos proxies de dados spring); ou seja, usando a única linha

List<Registration> findByPlaceContaining(String place);

é suficiente.


23
Também pode ser útil ignorar maiúsculas e minúsculas para uma consulta, usando: findByPlaceIgnoreCaseContaining (String place);
ilyailya de

Apenas como um comentário lateral - você não pode misturar e combinar%: param% com% param% dentro da mesma consulta. Caso contrário, o aplicativo nem iniciará.
RVP de

Obrigado. Eu costumava escrever like '%:place%'com 'e não obtinha nenhum resultado, porque o Hibernate adiciona 's às strings sozinho.
Yamashiro Rion

Esta não é uma boa resposta e também é potencialmente perigosa. Spring resolveu isso com ContainingIgnoreCase, verifique minha resposta abaixo.
Alexius DIAKOGIANNIS

99

Você realmente não precisa do @Query anotação.

Você pode apenas usar o seguinte

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Para mim, esta é a melhor solução. Eu não sabia que você pode usar IgnoreCase combinado com Containing, ele não está na documentação.
Wilson Campusano

1
E se eu quiser usar muitas colunas? - Acho que @Query()é obrigatório, certo? Com essa abordagem, eu teria que fazer com orque não fosse realmente uma solução adequada para esse caso:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Você também pode implementar consultas semelhantes usando a palavra-chave com suporte do Spring Data JPA "Contendo" .

List<Registration> findByPlaceContaining(String place);

20

Para o seu caso, você pode usar métodos JPA diretamente. É como abaixo:

Contendo: select ... like%: place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

aqui, IgnoreCase irá ajudá-lo a pesquisar o item ignorando o caso.

Usando @Query em JPQL :

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

Aqui estão alguns métodos relacionados:

  1. Gostar findByPlaceLike

    … Onde x.local gosta? 1

  2. Começando com findByPlaceStartingWith

    … Onde x.place like? 1 (parâmetro vinculado com% anexado)

  3. EndingWith findByPlaceEndingWith

    … Onde x.place like? 1 (parâmetro vinculado a% prefixado)

  4. Contendo findByPlaceContaining

    … Onde x.place like? 1 (limite de parâmetro envolvido em%)

Mais informações, veja este link , este link e este

Espero que isso ajude você :)


6

Você pode ter uma alternativa de usar marcadores de posição como:

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

4

Experimente isso.

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

Útil se usarmos something=:placee another like %:place%em consulta.
hong4rc

1

quando chamo função, eu uso: findByPlaceContaining("%" + place);

ou: findByPlaceContaining(place + "%");

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


1

resposta exatamente será

-> `@Query (" selecione u da categoria u onde u.categoryName like%: input% ")
     Lista findAllByInput (@Param ("input") String input);

0

Solução encontrada sem @Query(na verdade tentei qual é "aceita". No entanto, não funcionou).

Tem que voltar em Page<Entity>vez de List<Entity>:

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

IgnoreCase parte foi crítica para conseguir isso!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.