web-dev-qa-db-fra.com

Spring Data mongo insensible à la casse comme une requête

Je souhaite rendre la recherche de texte insensible à la casse avec la requête regex avec spring-data mongo.

Par exemple dans Oracle:

select * from user where lower(username) like '%ab%'

Comment puis-je faire cette requête avec spring-data mongo?

Merci d'avance

7
AknKplnoglu

Vous pouvez essayer quelque chose comme ci-dessous. Suppose que vous avez une classe User pojo.

Utiliser MongoTemplate

i option pour les majuscules et les minuscules.

Criteria regex = Criteria.where("username").regex("*.ab.*", "i");
mongoOperations.find(new Query().addCriteria(regex), User.class);

Utilisation de MongoRepository (sensible à la casse)

List<User> users = userRepository.findByUserNameRegex(".*ab.*");

interface UserRepository extends MongoRepository<User, String> {
     List<User> findByUserNameRegex(String userName);
}

Utilisation de MongoRepository avec Query dsl (sensible à la casse)

List<User> users = userRepository.findByQuery(".*ab.*");

interface UserRepository extends MongoRepository<User, String> {
     @Query("{'username': {$regex: ?0 }})")
     List<User> findByQuery(String userName);
}

Pour les requêtes non basées sur Regex, vous pouvez désormais utiliser la recherche/tri sans distinction de casse par le classement avec les paramètres régionaux et la force définis sur primaire ou secondaire.

Query query = new Query(filter);
query.collation(Collation.of("en").
                  strength(Collation.ComparisonLevel.secondary()));
mongoTemplate.find(query,clazz,collection);
10
Veeram

Je sais que c'est une vieille question. Je viens de trouver la solution dans un autre article . Utilisez $ regex et $ options comme ci-dessous:

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

voir la réponse d'origine: https://stackoverflow.com/a/19068401

8
Arthur Kazemi
@Repository
public interface CompetenceRepository extends MongoRepository<Competence, String> {

    @Query("{ 'titre' : { '$regex' : ?0 , $options: 'i'}}")
    List<Competence> findAllByTitreLikeMotcle(String motCle);
}

Devrait fonctionner parfaitement, cela fonctionne dans mes projets.pour les mots en français aussi

3
liams62217

Oui, vous pouvez, si vous l'avez configuré correctement, j'ajouterais quelque chose comme ceci dans votre méthode de référentiel:

{'nom d'utilisateur': {$ regex:/ab/i}})

@Query ("{'username': {$ regex: /? 1/i}})")

Liste findUsersByUserName (String userName);

0
Euclides