Play Framework / JPA:使用点表示法查找但使用删除的相同查询不起作用

时间:2011-11-25 05:13:32

标签: java sql jpa playframework

假设我有几个实体看起来像这样:

@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实例无关的所有人:

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

这样可以正常工作并返回我期望的所有人。

但是,如果我稍微调整上述语句以删除与Bar无关的所有人员:

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子句删除People会导致异常?

2 个答案:

答案 0 :(得分:5)

问题是你在delete语句中有一个Join。 JPQL中的删除仅接受“where”子句,并将唯一表作为目标。你的加入打破了这种状况。请参阅JPQL上的Oracle documentation

答案 1 :(得分:0)

People.delete ("foo IN (?)",
   People.find("foo.bar <> ?", someInstanceOfBar).fetch ()
)

这样简单有效吗?