3 Stimmen

Play Framework/JPA: Suche mit Punktnotation funktioniert, aber dieselbe Abfrage mit Löschen nicht

Nehmen wir an, ich habe ein paar Entitäten, die wie folgt aussehen:

@Entity
public class Person extends Model {
    @ManyToOne
    @JoinColumn(name = "fooId", nullable = false)
    public Foo foo;
    ...
}

@Entity
public class Foo extends Model {
    @ManyToOne
    @JoinColumn(name = "barId", nullable = false)
    public Bar bar;
    ...
}

Nehmen wir an, ich möchte alle Personen finden, die nicht mit einer bestimmten Instanz von Bar verbunden sind:

Person.find("foo.bar <> ?", someInstanceOfBar).fetch();

Das funktioniert einwandfrei und liefert alle Personen, die ich erwarten würde.

Wenn ich jedoch die obige Anweisung leicht abändere, um alle Personen zu löschen, die nicht mit Bar verbunden sind:

Person.delete("foo.bar <> ?", someInstanceOfBar);

Ich erhalte die folgende Meldung:

PersistenceException occured : org.hibernate.exception.SQLGrammarException: could not execute update query
...
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "DELETE FROM PERSON CROSS[*] JOIN FOO FOO1_ WHERE BARID<>? ";

Irgendwelche Ideen, warum die Suche nach Personen die richtige Anzahl von Zeilen zurückgeben würde, aber das Löschen von Personen mit der gleichen Where-Klausel zu einer Ausnahme führen würde?

5voto

Pere Villega Punkte 16419

Das Problem ist, dass Sie einen Join in der Löschanweisung haben. Delete in JPQL akzeptiert nur "where"-Klauseln und eine eindeutige Tabelle als Ziel. Ihr Join bricht diese Bedingung. Siehe Oracle-Dokumentation auf JPQL

0voto

Robert de W Punkte 306
People.delete ("foo IN (?)",
   People.find("foo.bar <> ?", someInstanceOfBar).fetch ()
)

Als ob das einfach und effektiv wäre?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X