Bonjour,
Je suis actuellement en train de developper une application utilisant Spring et JPA. Et je cherche à recupérer le contenu d'une table appelée Product en filtrant par rapport à une propriété d'une table enfant.
En effet, ma table Product comporte une clé etrangère faisant référence à une table ProductType et cette table ProductType a une propriété famille.
Je cherche donc un moyen pour obtenir la liste des produits d'une famille spécifique.
En SQL, cela donne SELECT * FROM Product p INNER JOIN ProductType t ON p.type = t.id WHERE t.family = 'voiture'.
Après lecture des doc Spring, le seul moyen est de passer par le CriteriaBuilder de JPA.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CREATE TABLE IF NOT EXISTS ProductType ( id INTEGER NOT NULL , name VARCHAR(45) NOT NULL , family VARCHAR(25) NOT NULL , PRIMARY KEY (id) ); CREATE TABLE IF NOT EXISTS Product ( id INTEGER NOT NULL , productType INT references ProductType(id) , name VARCHAR(30) NULL , price double NOT NULL, PRIMARY KEY (id) );
J'ai donc essayé de le faire mais je n'arrive pas à selectionner la propriété family de la table ProductType pour ma clause WHERE.
Voici le code que j'ai écrit :
En effet, j'ai une exception qui m'indique que la propriété productType.family n'appartient pas à la classe Product.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<Product> criteriaQuery = criteriaBuilder.createQuery(Product.class); Root<Product> productRoot = criteriaQuery.from(JpaProbeSettings.class); Predicate predicate = criteriaBuilder.equal(probeSettingsRoot.get("productType.family"), probeFamily), criteriaQuery.where(predicate); CriteriaQuery<Product> select = criteriaQuery.select(productRoot ); TypedQuery<Product> typedQuery = entityManager.createQuery(select); List<Product> resultList = typedQuery.getResultList();
Partager