Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Play Framework/JPA:使用点表示法查找有效,但使用delete的相同查询无效_Java_Sql_Jpa_Playframework - Fatal编程技术网

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 ()
)