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

}  
Channa
la source
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.

Roadrunner
la source
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);
} 

la source
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.

Solide comme un roc
la source
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();
Dapper Dan
la source
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