68 votes

hiberner le constructeur de critères jpa ignorer les requêtes de cas

Comment faire une requête similaire à ignorer la casse à l'aide du générateur de critères. Pour la propriété de description, je veux faire quelque chose comme upper(description) like '%xyz%'

j'ai la requête suivante

 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

    CriteriaQuery<Person> personCriteriaQuery = criteriaBuilder.createQuery(Person.class);
    Root<Person> personRoot = personCriteriaQuery.from(Person.class);

    personCriteriaQuery.select(personRoot);
    personCriteriaQuery.where(criteriaBuilder.like(personRoot.get(Person_.description), "%"+filter.getDescription().toUpperCase()+"%"));
    List<Person> pageResults = entityManager.createQuery(personCriteriaQuery).getResultList();

120voto

axtavt Points 126632

Il existe une méthode CriteriaBuilder.upper()

 personCriteriaQuery.where(criteriaBuilder.like(
    criteriaBuilder.upper(personRoot.get(Person_.description)), 
    "%"+filter.getDescription().toUpperCase()+"%"));

21voto

Si la base de données contient des mots allemands avec des lettres comme Fußballschuhe dans la colonne, Java modifiera le paramètre en majuscule en FUSSBALLSCHUHE et la requête ne correspondra pas. Les minuscules fonctionneront dans ce cas :

 personCriteriaQuery.where(criteriaBuilder.like(
    criteriaBuilder.lower(personRoot.get(Person_.description)), 
    "%"+filter.getDescription().toLowerCase()+"%"));   

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X