JPA Critères de l'API avec plusieurs paramètres
J'ai besoin de faire une méthode de recherche qui utilise la JPA Critères de l'API avec plusieurs paramètres.
Maintenant, le problème est que chaque paramètre est requis. Ainsi, certains pourraient être nulle, et qu'ils ne devraient pas être inclus dans la requête. J'ai essayé cela avec la CriteriaBuilder mais je ne pouvais pas voir comment le faire fonctionner.
Avec Hibernate Critères d'API c'est assez facile. Il suffit de créer les critères et ensuite ajouter des Restrictions.
Criteria criteria = session.createCriteria(someClass.class);
if(someClass.getName() != null) {
criteria.add(Restrictions.like("name", someClass.getName());
}
Comment aurais-je pu réaliser la même chose avec JPA Critères d'API?
Vous devez vous connecter pour publier un commentaire.
Concept est de construire la matrice de javax.la persistance.Prédicat qui ne contient que des prédicats que nous voulons utiliser:
Exemple de l'entité à être interrogé:
Requête elle-même:
em
exemple ?Prendre un coup d'oeil à ce site JPA Critères d'API. Il y a beaucoup d'exemples.
Mise à jour: Fournir un exemple concret
Nous allons chercher pour les Comptes avec un solde inférieur à une valeur spécifique:
D'abord créer un critère Constructeur
Pour obtenir le résultat régler le paramètre(s) et exécutez la requête:
BTW: L'entityManager est injecté quelque part dans un EJB/Service/DAO.
Mikko réponse a fonctionné à merveille. Seul changement que j'avais besoin de faire, est de le remplacer:
cq.select(customer).where(predicates.toArray(new Predicate[]{}));
avec:
Quelque part la conversion de liste à un tableau à l'origine, n'a pas de travail.
D'abord, Mikko réponse que m'a fait ma réponse. Upvote pour que.
Mon scénario était que je voulais relation parent/enfant et je voulais trouver une correspondance sur ~tout~ l'enfant.
Employé a plusieurs JobTitle(s).
Je voulais trouver un employé (où la a de nombreux titres d'emploi), mais le trouver sur ~tout de la jobtitles-je envoyer.
SQL ressemblerait à:
Select * from dbo.Employé (e) s se joindre dbo.JobTitle jt de l'e.EmployeeKey = jt.EmployeeKey
OÙ ( jt.JobTitleName = "programmeur" OU jt.JobTitleName = 'badcop' )
Je l'ai jeté dans le sexe et la date de naissance pour compléter l'exemple (et de donner plus de "facultatif") critères d')
Mon JPA code
Mais j'ai pensé que la mienne à cause de prédicats.toArray(new Prédicat[]{}) , aka, les varargs truc. (Merci Mikko)
Je fais aussi de la "implémente Specifiction" la méthode.
Autres liens utiles:
JPA cahier des charges par Exemple
JPA CriteriaBuilder conjointement à des critères d'une disjonction critères
Une solution simple pour le Printemps, en utilisant les expressions lambda: