【发布时间】:2018-08-21 18:01:56
【问题描述】:
我试图理解为什么 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不映射Orders):
@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 存储库。
【问题讨论】:
-
您能否发布关系参数(即如何定义 Credit 和 Credit in Order)
-
@osamayaccoub 谢谢,我用相关代码编辑了问题。
-
你也可以允许hibernate记录查询并检查生成的查询......我认为最终生成的查询不会相同......还有一些数据库对从多个表中删除有限制......你使用的是哪个数据库引擎stackoverflow.com/questions/783726/…
标签: jpa spring-data-jpa hql jpql sql-delete