% Like% Query in primavera JpaRepository


110

Vorrei scrivere una query simile in JpaRepositoryma non restituisce nulla:

LIKE '%place%'-la sua non funziona.

LIKE 'place' funziona perfettamente.

Ecco il mio codice:

@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);
}

Risposte:


199

La query JPA dei dati primaverili richiede i caratteri "%" e uno spazio che segue likenella query, come in

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

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

Potresti voler eliminare completamente l' @Queryannotazione, poiché sembra assomigliare alla query standard (implementata automaticamente dai proxy dei dati primaverili); cioè utilizzando la riga singola

List<Registration> findByPlaceContaining(String place);

è sufficiente.


23
Può essere utile anche ignorare le maiuscole / minuscole per una query, utilizzando: findByPlaceIgnoreCaseContain (String place);
ilyailya

Proprio come un commento laterale: non puoi mescolare e abbinare%: param% con% param% all'interno della stessa query. Altrimenti l'app non si avvia nemmeno.
RVP

Grazie. Scrivevo like '%:place%'con 'e non c'erano risultati, perché Hibernate aggiunge 's alle stringhe da solo.
Yamashiro Rion

Questa non è una buona risposta ed è anche potenzialmente pericolosa. La primavera ha risolto questo problema con ContainingIgnoreCase, controlla la mia risposta qui sotto.
Alexius DIAKOGIANNIS

99

In realtà non hai @Queryaffatto bisogno dell'annotazione.

Puoi semplicemente usare quanto segue

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Per me questa è la soluzione migliore. Non sapevo che potessi usare IgnoreCase combinato con Containing, non è nella documentazione.
Wilson Campusano

1
E il caso in cui voglio utilizzare molte colonne? - Credo @Query()sia un must, giusto? Con questo approccio dovrei fare in modo orche in realtà non sia una soluzione adatta per quel caso:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Puoi anche implementare le query simili utilizzando la parola chiave "Containing" supportata da Spring Data JPA .

List<Registration> findByPlaceContaining(String place);

20

Per il tuo caso, puoi utilizzare direttamente i metodi JPA. Questo è come il muggito:

Contenente: select ... like%: place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

qui, IgnoreCase ti aiuterà a cercare l'elemento ignorando il caso.

Utilizzando @Query in JPQL :

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

Ecco alcuni metodi correlati:

  1. Piace findByPlaceLike

    ... dove x.place come? 1

  2. Iniziare con findByPlaceStartingWith

    ... dove x.place come? 1 (parametro associato con% aggiunto)

  3. EndingWith findByPlaceEndingWith

    ... dove x.place come? 1 (parametro associato con% anteposto)

  4. contenente findByPlaceContaining

    ... dove x.place come? 1 (limite di parametro racchiuso in%)

Maggiori informazioni, visualizza questo collegamento , questo collegamento e questo

Spero che questo ti possa aiutare :)


6

Puoi avere un'alternativa all'utilizzo dei segnaposto come:

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

4

Prova questo.

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

Utile se usiamo something=:placee another like %:place%in query.
hong4rc

1

quando chiamata funtion, io uso: findByPlaceContaining("%" + place);

o: findByPlaceContaining(place + "%");

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


1

la risposta sarà esattamente

-> `@Query (" seleziona u dalla categoria u dove u.categoryName come%: input% ")
     List findAllByInput (@Param ("input") String input);

0

Soluzione trovata senza @Query(in realtà ho provato quale è "accettata". Tuttavia, non ha funzionato).

Devo tornare Page<Entity>invece di List<Entity>:

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

IgnoreCase parte è stata fondamentale per raggiungere questo obiettivo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.