我有两个ClassA和ClassB类。许多ClassB可以与单个ClassA关联,因此从ClassB到ClassA之间存在多对一关系。关系就像:
ClassA {
@ManyToOne(optional = false)
@JoinColumn(name = "ClassB_ID", referencedColumnName = "ID", nullable = false)
private ClassB classB = new ClassB();
}
我有这样的查询:
delete from ClassA as a
where a.classB in (select b from ClassB as b where b.attr1=?1 and b.attr2=?2)
and a.attr3=?3
我将此查询转换为:
delete from ClassA as a join a.classb as b where b.attr1=?1 and b.attr2=?2
and a.attr3=?3"
当我运行时,我得到以下异常:
ERROR PARSER - line 1:28: unexpected token: join org.springframework.dao.InvalidDataAccessApiUsageException:
要遍历的节点不能为空! 嵌套异常是 java.lang.IllegalArgumentException异常: 要遍历的节点不能为空!
有人可以帮忙吗?
感谢。
答案 0 :(得分:1)
您无法从JOIN中删除。你为什么要重写DELETE语句?
答案 1 :(得分:1)
我会这样说:没有JOIN可以在批量查询中使用。从官方文档:
13.4. DML-style operations
如前所述,自动和 透明对象/关系映射 关心的是管理 对象状态。对象状态是 在内存中可用。这意味着 直接操纵数据 数据库(使用SQL数据 操纵语言(DML) 语句:INSERT,UPDATE,DELETE) 不会影响内存状态。 但是,Hibernate提供了方法 用于批量SQL样式的DML语句 执行通过执行 Hibernate查询语言(HQL)。
UPDATE和的伪语法 DELETE语句是:
( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?
。需要注意的一些要点:
- 在from-clause中,
FROM
关键字是可选的- 在from子句中只能有一个实体。它可以, 但是,别名。如果是实体 name是别名,然后是任何属性 参考必须使用合格 别名。如果实体名称不是 别名,然后它是非法的 属性引用是合格的。
- 可以在批量中指定隐式或显式的joins HQL查询。可以使用子查询 where子句,子查询的位置 它们本身可能包含连接。
- where子句也是可选的。
所以你现在拥有的(使用子查询)是最佳的,没有理由重写它。