假设我有几个实体看起来像这样:
@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会导致异常?
答案 0 :(得分:5)
问题是你在delete语句中有一个Join。 JPQL中的删除仅接受“where”子句,并将唯一表作为目标。你的加入打破了这种状况。请参阅JPQL上的Oracle documentation
答案 1 :(得分:0)
People.delete ("foo IN (?)",
People.find("foo.bar <> ?", someInstanceOfBar).fetch ()
)
这样简单有效吗?