% Like% Query au printemps JpaRepository


110

Je voudrais écrire une requête similaire JpaRepositorymais elle ne renvoie rien:

LIKE '%place%'-ça ne fonctionne pas.

LIKE 'place' fonctionne parfaitement.

Voici mon code:

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

Réponses:


199

La requête JPA de données de printemps nécessite les caractères "%" ainsi qu'un caractère d'espace à la suite likede votre requête, comme dans

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

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

Vous voudrez peut-être vous débarrasser de l' @Queryannotation dans son ensemble, car elle semble ressembler à la requête standard (automatiquement implémentée par les proxys de données de printemps); ie en utilisant la seule ligne

List<Registration> findByPlaceContaining(String place);

est suffisant.


23
Il peut également être utile d'ignorer la casse d'une requête, en utilisant: findByPlaceIgnoreCaseContaining (String place);
ilyailya

Juste comme un commentaire secondaire - vous ne pouvez pas mélanger et faire correspondre%: param% avec% param% dans la même requête. Sinon, l'application ne démarrera même pas.
RVP

Je vous remercie. J'écrivais like '%:place%'avec 'et il n'y avait aucun résultat, car Hibernate ajoute des 's aux chaînes par lui-même.
Yamashiro Rion

Ce n'est pas une bonne réponse et c'est aussi potentiellement dangereux. Spring a réglé ce problème avec ContainingIgnoreCase, vérifiez ma réponse ci-dessous.
Alexius DIAKOGIANNIS le

99

Vous n'avez pas du tout besoin de l' @Queryannotation.

Vous pouvez simplement utiliser ce qui suit

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Pour moi, celui-ci est la meilleure solution. Je ne savais pas que vous pouviez utiliser IgnoreCase combiné avec Containing, ce n'est pas dans la documentation.
Wilson Campusano

1
Qu'en est-il du cas où je souhaite utiliser plusieurs colonnes? - Je crois que @Query()c'est un must, non? Avec cette approche, je devrais faire en sorte orque ce n'est pas vraiment une solution bien adaptée à ce cas:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Vous pouvez également implémenter les requêtes similaires à l'aide du mot clé pris en charge par Spring Data JPA "Containing" .

List<Registration> findByPlaceContaining(String place);

20

Pour votre cas, vous pouvez utiliser directement les méthodes JPA. C'est comme ci-dessous:

Contenant: sélectionnez ... comme%: place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

ici, IgnoreCase vous aidera à rechercher l'élément en ignorant la casse.

Utilisation de @Query dans JPQL :

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

Voici quelques méthodes associées:

  1. Comme findByPlaceLike

    … Où x.place comme? 1

  2. Commençant par findByPlaceStartingWith

    … Où x.place comme? 1 (paramètre lié avec% ajouté)

  3. EndingWith findByPlaceEndingWith

    … Où x.place comme? 1 (paramètre lié avec% en préfixe)

  4. Contenant findByPlaceContaining

    … Où x.place comme? 1 (paramètre lié enveloppé en%)

Plus d'infos, voir ce lien , ce lien et ceci

J'espère que ceci vous aidera :)


6

Vous pouvez avoir une alternative d'utiliser des espaces réservés comme:

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

4

Essaye ça.

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

Utile si nous utilisons something=:placeet another like %:place%en question.
hong4rc

1

quand appel funtion, j'utilise: findByPlaceContaining("%" + place);

ou: findByPlaceContaining(place + "%");

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


1

la réponse sera exactement

-> `@Query (" sélectionnez u dans la catégorie u où u.categoryName comme%: input% ")
     Liste findAllByInput (@Param ("input") String input);

0

Solution trouvée sans @Query(en fait, j'ai essayé laquelle est "acceptée". Cependant, cela n'a pas fonctionné).

Doit revenir Page<Entity>au lieu de List<Entity>:

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

IgnoreCase une partie était essentielle pour y parvenir!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.