7
votes

Comment utiliser JPQL pour supprimer des entrées d'une table de jointure?

J'ai un objet JPA qui a une relation de plusieurs à plusieurs, comme celle-ci:

DELETE FROM Role.privs p WHERE p.id=:privId


0 commentaires

3 Réponses :


3
votes

Les instructions de la mise à jour et de suppression JPQL doivent faire référence à un nom d'entité et non à un nom de table, donc je pense que vous n'avez pas de chance avec l'approche que vous avez suggérée.

Selon votre fournisseur JPA, vous pouviez Supprimer les entrées de l'articulation à l'aide d'une simple instruction SQL brute (doit être 100% portable), puis interagir par programme avec votre API de votre fournisseur de cache pour expulser les données. Par exemple, dans Hibernate, vous pouvez appeler EVICT () pour expirer tous les collections "ROOF.PRIVS" à partir du cache de 2e niveau: P>

sessionFactory.evictCollection("Role.privs", roleId); //evict a particular collection of privs
sessionFactory.evictCollection("Role.privs"); //evict all privs collections


0 commentaires

2
votes

Java est une langue orientée objet et tout le point d'ormission est de masquer les détails des tables de jointure et de votre part. Par conséquent, même en contemplant la suppression d'une table de jointure sans envisager les conséquences serait étrange.

Non, vous ne pouvez pas le faire avec JPQL, c'est-à-dire pour les entités.

récupérer les entités à l'une ou l'autre extrémité et effacer leurs collections. Cela supprimera les entrées des tables de jointure. Orienté objet.


0 commentaires

3
votes

Je recherche également une approche JPQL pour supprimer une relation nombreuses à plusieurs (contenue dans une table de jonction). Évidemment, il n'y a pas de concept de tables dans un orj, nous ne pouvons donc pas utiliser les opérations de suppression ... mais je souhaite qu'il y ait un opérateur spécial pour ces cas. Quelque chose comme un lien et unlink. Peut-être une fonctionnalité future?

Quoi qu'il en soit, ce que je faisais pour atteindre ce besoin a été de travailler avec les collections mises en œuvre dans les haricots de l'entité, ceux qui mappent les nombreuses à-nombreuses relations. < P> Par exemple, si j'avais un étudiant de classe qui a une relation de plusieurs à plusieurs avec des cours: xxx

i Construire dans l'entité un getter et un setter pour cette collection . Ensuite, par exemple à partir d'une EJB, je récupère la collection à l'aide du getter, ajoutez ou retirez le cours souhaité, puis utilisez le Setter pour attribuer la nouvelle collection. Et c'est fait. Cela fonctionne parfaitement.

Cependant, ma principale inquiétude est la performance. Un orèse est censé garder une énorme cache de tous les objets (si je ne me trompe pas), mais même l'utiliser pour travailler plus vite, je me demande si la récupération de tous et que chaque élément d'une collection est vraiment efficace ...

Parce que pour moi, c'est autant d'inefficace que de récupérer les registres d'une table et post-filtrez-les à l'aide de PURE Java au lieu d'une langue de requête qui fonctionne directement ou indirectement avec le moteur à dB interne (SQL, JPQL ...). / p>


0 commentaires