Java Play Framework/JPA:使用点表示法查找有效,但使用delete的相同查询无效
假设我有两个实体看起来像这样:Java Play Framework/JPA:使用点表示法查找有效,但使用delete的相同查询无效,java,sql,jpa,playframework,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", nullab
@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();
Person.find(“foo.bar?”,someInstanceOfBar.fetch();
这样做很好,回报了我所期望的所有人
但是,如果我稍微调整上面的语句以删除所有与Bar无关的人:
Person.delete("foo.bar <> ?", someInstanceOfBar);
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<>? ";
发生PersistenceException:org.hibernate.exception.sqlgrammareException:无法执行更新查询
...
原因:org.h2.jdbc.JdbcSQLException:SQL语句“DELETE FROM PERSON CROSS[*]JOIN FOO FOO1_uu1;WHERE BARID?”中的语法错误;
您知道为什么查找人员会返回正确的行数,而使用相同的where子句删除人员会导致异常吗?问题是delete语句中有Join。JPQL中的Delete只接受“where”子句和唯一表作为目标。你的加入打破了这个条件。请参见JPQL上的People.delete(“foo IN(?)”, People.find(“foo.bar?”,someInstanceOfBar.fetch() )
这样做简单有效吗?除了使用find语句,然后循环遍历所有语句并逐个调用delete之外,还有什么简单的解决方法吗?@digiarnie我不知道
People.delete ("foo IN (?)",
People.find("foo.bar <> ?", someInstanceOfBar).fetch ()
)