jpa - JPQL 查询删除不接受声明的 JOIN?

标签 jpa spring-data-jpa hql jpql sql-delete

我试图理解为什么 Hibernate 不接受这个遵循 JPQL:

@Modifying
@Query("delete from Order order JOIN order.credit credit WHERE credit.id IN ?1")
void deleteWithListaIds(List<Long> ids);

我收到的错误是:
Caused by: java.lang.IllegalArgumentException: node to traverse cannot be null!
    at org.hibernate.hql.internal.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:46)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)

但接受这一点:
@Modifying
@Query("delete from Order order WHERE order.credit.id IN ?1")
void deleteWithListaIds(List<Long> ids);

实体Order (实体 Credit 不映射 Order s):
@Entity
public class Order {

    @Id
    @Setter
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
    @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 1)
    @Column(name = "id", nullable = false)
    private Long id;

    @JoinColumn(name = "credit_id", foreignKey = @ForeignKey(name = "fk_order_credit"))
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Credit credit;


}

select声明,这两种方法都被接受,但我不明白为什么 Hibernate 有这个限制,或者我在 DELETE Jpql 中做错了什么。我想在查询中声明 JOIN。

我知道在更复杂的查询中解决这个问题的唯一方法是创建一个子选择:
delete from Order order WHERE order.id IN (
    SELECT order.id FROM Order order
    JOIN order.credit credit
    WHERE credit.id in ?1)

对于更复杂的删除查询,这是正确的方法吗?

我在上面的代码和 Spring Boot 1.5.10.RELEASE 中使用了 Spring Jpa 存储库。

最佳答案

I don't understand why Hibernate have this limitation.


它在 JPA Spec 中是这样指定的。在第 4.10 节中:
delete_statement ::= delete_clause [where_clause]
delete_clause ::= DELETE FROM entity_name [[AS] identification_variable]
所以在删除语句中不允许连接。
为什么以这种方式决定这纯粹是我的猜测。
但是select_clausedelete_clause指定查询操作的内容。虽然选择语句对多个实体的组合进行操作是完全没问题的,但用于删除的连接并没有多大意义。
它只是强制您指定要删除的实体。

The only way that I know to resolve this problem in more complex queries is to create a subselect:

Is this the right approach for more complex delete queries?


如果你不能用更简单的方式表达它,那么是的,这就是要走的路。

关于jpa - JPQL 查询删除不接受声明的 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256884/

相关文章:

java - Spring 启动 JPA : Could not Extract Result Set Error

java - 在 JPA 中查询时出错

java - 如何在循环时将一个列表添加到另一个列表?

java - 使用列表参数将 HQL 查询转换为可执行的 SQL 查询

Nhibernate - 如何调试 "Antlr.Runtime.NoViableAltException"?

java - 测试环境中的JPA @PrePersist

java - 在hibernate中使用主键和外键组合映射三个表

spring - 使用两种类型的 Kotlin JPA 查询内部连接

java - Spring Boot 中过滤器链中的自定义数据源

java - Spring JPA 投影 findAll