Bonjour,
Je voudrais faire un multi-select où une des entités est dynamique.
Je m'explique:
J'ai une table de référence en BD (sorte d'index). J'ai 5 autres tables qui contiennent des données associées pour chaque ligne de cette table de référence (relation 1-1 entre une ligne de la table de référence avec une ligne d'une des 5 autres tables). Dans chacune de ces tables, j'ai un donc un identifiant correspondant à l'id de la table de référence. Dans la table de référence, j'ai une colonne TYPE qui me permet de savoir dans quelle table aller chercher la ligne correspondante dans une des 5 tables.
Actuellement, je récupère donc une page dans la table de référence puis je boucle sur la liste résultat pour aller chercher la ligne correspondante dans une des 5 tables en fonction de la colonne TYPE. Ce process est lourd en utilisation de CPU et je voudrais récupérer en une requête les lignes de référence avec leur ligne associée provenant d'une des 5 tables.
J'essaye d'utiliser CriteriaBuilder et un multiselect mais la table associée étant dynamique en fonction de la colonne TYPE de la première table (il y a une classe entité mère pour chacune de nos entités), je ne sais pas comment implémenter cet aspect.
Objet résultat souhaité regroupant les 2 entités:
Tentative de code (non fonctionnel et où je bloque:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class ReferenceWithDetail { private ReferenceEntity referenceEntity; // GenericEntity est le type parent commun de toutes les entités. Ici l'instance voulue doit être dynamique (ex: MyTable1Entity, MyTable2Entity...) private GenericEntity lineLinkedToRef; ... }
Avez-vous une idée ou une solution qu'il serait possible d'implémenter svp?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 private List<ReferenceWithDetail> getPageContentWithDetail(List<Long> groupIds, org.springframework.data.domain.Sort.Order datePropertyToSort, CriteriaBuilder criteriaBuilder) { CriteriaQuery<ReferenceWithDetail> criteriaQuery = criteriaBuilder.createQuery(ReferenceWithDetail.class); Root<ReferenceEntity> root = criteriaQuery.from(ReferenceEntity.class); // Ici l'entité voulue hérite de GenericEntity est doit être dynamique en fonction de la colonne TYPE de l'entité ReferenceEntity. Possible? Root<GenericEntity> rootDetail = criteriaQuery.from(GenericEntity.class); lCriteriaQuery.multiselect(root, rootDetail); Predicate predicateGroupId = root.get("groupId").in(groupIds); Predicate predicateJoin = criteriaBuilder.equal(root.get("id"), rootDetail.get("refId")); Predicate predicate = criteriaBuilder.and(predicateJoin, predicateGroupId); criteriaQuery.where(predicate); ... return entityManager.createQuery(criteriaQuery).getResultList(); }
Partager