Bonjour,
j'ai les définitions de deux objets tels que :
Je souhaite créer une méthode qui récupère en base tous les moteurs contenant une liste de pièces donnée en entrée.
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33 @Entity public class Moteur { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy="moteur") private Set<Piece> pieces = new HashSet<Piece>(); ... } @Entity public class Piece { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(length = 705) private String value1; @Column(length = 427) private String value2; @Column(length = 5) private String value3; @ManyToOne @JoinColumn(name="moteurId") private Moteur moteur; ... }
Dans ma classe repo, j'ai donc essayé tout simplement quelque chose comme ça :
Ca ne me retourne aucun résultat alors que ca devrait. J'imagine que c'est à cause des objets pièces contenus dans mon Set. En effet, chaque objet piece de mon Set<Piece> en paramètre de ma requête est construit avec uniquement les attributs value1, value2 et value3, qui est le triplé discriminant pour identifier une pièce.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public interface MoteurRepository extends JpaRepository<Moteur, Long> { List<Moteur> findByPieces(Set<Piece> pieces); ... }
Donc, comme l'attribut moteur est à null dans chacun des objets et qu'en base il est renseigné avec l'id du moteur, je n'ai aucun résultat (conclusion vraie ? fausse ?).
Je vois la tête que ma requête en SQL devrait avoir au final :
Mais je n'arrive pas à trouver l'équivalent en JPQL, surtout pour la décomposition du Set<Piece> passé en paramètre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT moteur FROM MOTEUR moteur where moteur.ID IN ( SELECT piece.moteurId FROM PIECE piece where ( (piece.value1 = 'a' and piece.value2 = 'b' and piece.value3 = 'c') OR (piece.value1 = 'd' and piece.value2 = 'e' and piece.value3 = 'f') OR (piece.value1 = 'g' and piece.value2 = 'h' and piece.value3 = 'i') ) )
Du coup, ma question est : quelle est la façon de faire ? J'ai essayé avec des requêtes @QUERY du style :
Mais bon, les requêtes c'est pas mon fort apparemment :-(
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 @Query("SELECT moteur FROM MOTEUR moteur WHERE moteur.pieces = pieces") @Query("SELECT moteur FROM MOTEUR moteur JOIN PIECE ... ") etc...
Je suis preneur de toute réponse, ma structure de table n'est pas établie, s'il faut ajouter une table de jointure, faire des relations unidirectionnelles ou autre, ça ne me pose pas de soucis.
En fait le seul truc que je veux éviter, c'est avoir à faire plusieurs requêtes successives du style :
Merci d'avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Set<Piece> pieces = (findPiece(value1, value2, value3) + findPiece(value1, value2, value3) + findPiece(value1, value2, value3)) Set<Moteur> moteur = findByPieces(Set<Piece> pieces)
Partager