Play Framework/JPA:ドット表記を使用して検索するが、deleteを使用して同じクエリを検索する

このように見えるエンティティが2つあるとします。

@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;
    ...
}

ここで、Barの特定のインスタンスに関連付けられていないすべてのPeopleを検索するとします。

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

これは正常に動作し、私が期待するすべての人を返します。

しかし、Barと関連付けられていないすべてのPeopleを削除するために上記のステートメントをわずかに微調整すれば:

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

私は次のようになる:

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<>? ";

Peopleを検索する理由が正しい行数を返しても、同じwhere-clauseを使用してPeopleを削除すると、例外が発生するでしょうか?

3

2 答え

問題は、deleteステートメントにJoinがあることです。 JPQLでの削除では、 "where"節とターゲットとしてのユニークな表しか受け付けません。あなたの参加はその条件を破ります。 JPQLの Oracleのマニュアルを参照してください。

5
追加された
@digiarnie私が知っていることではない
追加された 著者 Pere Villega,
この問題の簡単な解決方法は、findステートメントを使用し、それらをすべてループし、個別にdeleteを呼び出すよりも簡単ですか?
追加された 著者 digiarnie,
People.delete ("foo IN (?)",
   People.find("foo.bar <> ?", someInstanceOfBar).fetch ()
)

このように簡単で効果的でしょうか?

0
追加された