Requête insensible à la casse avec Spring CrudRepository


102

Avec Spring CrudRepository Query; Je veux sélectionner les entités "DeviceType" avec sa propriété "name". Mais la requête suivante sélectionnez les droits de manière sensible à la casse. Comment je le fais de manière insensible à la casse. Merci.

public interface DeviceTypeRepository extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContaining(String name);

}  

16
Avez-vous essayé public Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);?
Peter Keller

Si vous êtes intéressé par la requête, veuillez essayer ceci, pas besoin de donner '%' après LIKE <code> @Query (value = "sélectionnez dt dans DeviceType comme dt où inférieur (dt.name) comme inférieur (: nom)" ) public Iterable <DeviceType> anyMethodNameGoesHere (@Param (name) String name); </code>
Java_Fire_Within

Réponses:


197

Exactement comme @Peter l'a mentionné dans le commentaire, ajoutez simplement IgnoreCase:

public interface DeviceTypeRepository 
    extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContainingIgnoreCase(String name);
}  

Consultez la documentation pour obtenir une liste de tous les mots clés pris en charge dans les noms de méthode.


Merci beaucoup pour la réponse; bien sûr, je vais renvoyer cette documentation. Merci. Amuse-toi bien !
Channa

3
Cela a fonctionné pour moi. J'utilisais la requête JPA. Donc, selon la documentation, où UPPER (x.firstame) = UPPER (? 1) a fonctionné.
sunitha

@sunitha savez-vous comment nous pourrions modifier ce comportement, disons le réduire? Ma base de données a une indexation basée sur des minuscules
Sudip Bhandari

@SudipBhandari: Bien sûr que vous pouvez.
sunitha

1
Pour plusieurs propriétés, répétez IgnoreCasecomme ceci:List<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain);
Tarator

11

La requête mongo de données Spring suivante fonctionne pour moi. Je préférerais utiliser Listau lieu deIterator

public interface DeviceTypeRepository extends CrudRepository<DeviceType,Integer>, JpaSpecificationExecutor<DeviceType> {
    List<DeviceType> findByNameIgnoreCase(String name);
} 

1

Dans mon cas, l'ajout IgnoreCasene fonctionnait pas du tout.

J'ai trouvé qu'il est également possible de fournir des options pour l'expression régulière:

@Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
Foo findByTitleRegex(String regexString);

L' ioption rend la requête insensible à la casse.


1

Pour ceux qui utilisent une requête JPA personnalisée, le mot clé Upper et toUpperCase sont utiles . Le code suivant fonctionne pour moi

 return  entityManager.createQuery("select q from "table " q  where upper(q.applicant)=:applicant")
    .setParameter("applicant",applicant.toUpperCase().trim()).getSingleResult();

1
Soyez prudent lorsque vous utilisez 'upper (q.applicant)'. Dans Postgres, cela provoque '.PSQLException: ERROR: la fonction supérieure (bytea) n'existe pas' lorsque q.applicant est nul
advortsov
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.