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'.

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)
);
Après lecture des doc Spring, le seul moyen est de passer par le CriteriaBuilder de JPA.

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 :
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();
En effet, j'ai une exception qui m'indique que la propriété productType.family n'appartient pas à la classe Product.