2
votes

Rejoindre une collection d'éléments à gauche en utilisant JPQL

Supposons que j'ai ces classes, notez que les entités ne sont pas liées de toute façon.

@Entity
class Laptop {
 @Id
 String userId;
 @Column
 String name;
 ...
}

@Entity
class Foo {
 ...

 @Column
 @ElementCollection
 List<String> idsPointingToAnEntity;

 ...
}

Étant donné que j'ai cette classe Foo qui a un attribut de idsPointingToAnEntity , je pourrais y stocker une liste des identifiants d'ordinateur portable ou des identifiants de String. Disons que Foo a idsPointingToAnEntity = [1,2,3], ce [1,2,3] a une entrée Laptop équivalente dans la base de données.

Comment puis-je quitter la jointure / joignez-les avec un ordre en JPQL tel que le résultat est une liste de Foo triés par noms d'ordinateurs portables.

En théorie, je pense que c'est quelque chose comme ça.

Sélectionnez f De Foo f LEFT JOIN Laptop l ON l.id IN f.idsPoitingToAnEntity ORDER by l.name

Mais cela a une erreur pour moi depuis f.idsPoitingToAnEntity code > est une table de jointure.

Remarque: idsPointingToAnEntity peut également être une autre entité faisant que List n'est pas une option

p>


2 commentaires

Vous ne pouvez pas utiliser @OrderColumn sur idsPointingToAnEntity ? La table cible contient une colonne name donc @OrderColumn (name = "name") devrait fonctionner avec @ElementCollection ... Exemple ici , vérifiez l'en-tête " Ajout d'une OrderColumn "


@OrderColumn ne fonctionnera pas car il n'est pas lié à un nom, il peut s'agir de l'attribut de n'importe quelle entité


3 Réponses :


0
votes

Vous ne pouvez utiliser aucune jointure pour obtenir ce résultat:

SELECT l FROM Laptop l
CROSS JOIN Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name

Ou utilisez CROSS JOIN , un type spécial de jointure qui ne nécessite aucune condition de correspondance:

SELECT l FROM Laptop l, Foo f
WHERE l.id IN f.idsPointingToAnEntity ORDER BY l.name

PS: le problème de l'utilisation de la jointure croisée dans ce scénario, c'est qu'elle génère le Produit cartésien , pas toutes les lignes du côté gauche.


0 commentaires

1
votes

Si vous utilisez JPA 2.1 ou supérieur, vous utilisez JOIN ON dans JPQL sur des entités non liées. Rejoignez d'abord le tableau des ID, comme ceci:

select f from Foo f 
join f.idsPointingToAnEntity id 
join Laptop l ON id=l.id
join AnotherEntity a ON id=a.id


0 commentaires

0
votes

La réponse courte ici est simplement de ne pas faire cela. Il utilise mal la fonctionnalité spécifique et risque de causer des problèmes à mesure que votre liste s'allonge. Vous n'avez aucune bonne justification pour faire cela. Si vous pensez que la liste est petite, la charge de la base de données est minime et il n'y a aucune raison de mettre des références dans un ElementCollection . Si la liste s'agrandit, vous ne voulez certainement pas d'un ElementCollection .

Référence Différence entre @OneToMany et @ElementCollection? . Un ElementCollection sert à créer un OneToMany entre, dans votre cas, Foo et idsPointingToAnEntity . Il n'est certainement pas destiné à être utilisé comme une relation un-à-plusieurs avec table de jointure .


0 commentaires