Ich habe folgende Entitäten:
Ich möchte WordSet mit der ID und dem Benutzernamen des Benutzers mit JPA löschen.
Hier sind Entitätsdeklarationen:
Benutzer
%Vor%UserDictionary
%Vor%WordSet
%Vor%Hier ist ein Teil meines WordSetDao:
%Vor% findByIdAndUsername
funktioniert einwandfrei, aber delete löst folgende Ausnahme aus:
Auch statt
DELETE FROM WordSet w WHERE w.userDictionary.user.username = :username AND w.id = :id
Ich habe folgende Abfrage versucht:
%Vor%Und es funktioniert auf meiner H2-Datenbank, schlägt aber bei MySQL mit folgender Ausnahme fehl:
%Vor%Ich habe über Unterabfragen und MySQL gegoogelt ( one , zwei ), konnte aber nicht herausfinden, wie man einen solchen Trick mit JPA macht.
Also, wie Wordset zu löschen? Stimmt etwas mit meiner Entitätszuordnung nicht?
Hier ist mein DB-Schema, es sieht korrekt aus:
Es gibt einige Dinge, die in diesem Mapping falsch sind:
Sie sagten, es funktioniert für H2, aber das stimmt nicht:
%Vor%Dieser Abfragetyp wird von MySQL nicht unterstützt:
%Vor%java.sql.SQLException: Sie können die Zieltabelle 'word_set' nicht für angeben Aktualisierung in FROM-Klausel unter com.mysql.jdbc.SQLError.createSQLException (SQLError.java:964) ~ [mysql-connector-java-5.1.40.jar! /: 5.1.40]
Diese Ausnahme wird verursacht, weil Sie in MySQL die selbe Tabelle, die Sie im SELECT-Teil verwenden, nicht ändern / löschen können. Hier dokumentiert dieses Verhalten Ссылка . Die Lösungen 1) verschachteln die Unterabfrage tiefer in eine From-Klausel oder 2) verbinden die Tabelle mit sich selbst
Haben Sie versucht, den Löschvorgang regelmäßig beizutreten? Es gibt eine ähnliche Frage hier: Löschen mit Join in MySQL
... zwar nicht über JPA, aber es gibt eine akzeptierte Antwort, die ein Beispiel für ein Join-basiertes Löschen zeigt, aber es scheint MySQL-spezifisch zu sein.
Der Trick besteht darin, die tatsächliche Tabelle in der delete-Klausel selbst anzugeben, nicht nur die from-Klausel, wenn Sie andere Tabellen haben, die über JOINs referenziert werden.
Ich bin nicht eingerichtet, JPA gegen mysql im Moment zu testen. JQL kann dies möglicherweise nicht verarbeiten, aber Sie könnten es wahrscheinlich mit einer systemeigenen Abfrage tun.