API de critères JPA avec plusieurs parameters

Je dois créer une méthode de recherche utilisant l’API JPA Criteria avec plusieurs parameters. Maintenant, le problème est que tous les parameters ne sont pas requirejs. Donc, certains peuvent être nuls et ne doivent pas être inclus dans la requête. J’ai essayé cela avec CriteriaBuilder mais je ne voyais pas comment le faire fonctionner.

Avec l’API Hibernate Criteria, c’est assez facile. Créez simplement les critères, puis ajoutez des ressortingctions.

Criteria criteria = session.createCriteria(someClass.class); if(someClass.getName() != null) { criteria.add(Ressortingctions.like("name", someClass.getName()); } 

Comment atteindre le même objective avec l’API Criteria de JPA?

    Le concept consiste à construire un tableau de javax.persistence.Predicate qui contient uniquement les prédicats que nous voulons utiliser:

    Exemple d’entité à interroger:

     @Entity public class A { @Id private Long id; Ssortingng someAtsortingbute; Ssortingng someOtherAtsortingbute; ... } 

    Interroger lui-même:

      //some parameters to your method Ssortingng param1 = "1"; Ssortingng paramNull = null; CriteriaBuilder qb = em.getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(); Root customer = cq.from(A.class); //Constructing list of parameters List predicates = new ArrayList(); //Adding predicates in case of parameter not being null if (param1 != null) { predicates.add( qb.equal(customer.get("someAtsortingbute"), param1)); } if (paramNull != null) { predicates.add( qb.equal(customer.get("someOtherAtsortingbute"), paramNull)); } //query itself cq.select(customer) .where(predicates.toArray(new Predicate[]{})); //execute query and do something with result em.createQuery(cq).getResultList(); 

    Jetez un oeil à ce site API JPA Criteria . Il y a beaucoup d’exemples.

    Mise à jour: fournir un exemple concret

    Recherchons les comptes dont le solde est inférieur à une valeur spécifique:

     SELECT a FROM Account a WHERE a.balance < :value 

    Commencez par créer un générateur de critères.

     CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery accountQuery = builder.createQuery(Account.class); Root accountRoot = accountQuery.from(Account.class); ParameterExpression value = builder.parameter(Double.class); accountQuery.select(accountRoot).where(builder.lt(accountRoot.get("balance"), value)); 

    Pour obtenir le résultat, définissez le (s) paramètre (s) et exécutez la requête:

     TypedQuery query = entityManager.createQuery(accountQuery); query.setParameter(value, 1234.5); List results = query.getResultList(); 

    BTW: entityManager est injecté quelque part dans un EJB / Service / DAO.

    La réponse de Mikko a parfaitement fonctionné. Le seul changement que je devais faire était de remplacer:

    cq.select(customer).where(predicates.toArray(new Predicate[]{}));

    avec:

     Predicate [] predicatesarr = predicates.toArray(new Predicate[predicates.size()]); cq.select(customer).where(predicatesarr); 

    Quelque part, la conversion de liste en tableau dans l’original ne fonctionnait pas.