将子查询转换为jpql中的连接

时间:2010-11-05 15:09:12

标签: java hibernate jpa

我有两个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异常:   要遍历的节点不能为空!

有人可以帮忙吗?

感谢。

2 个答案:

答案 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子句也是可选的。
  •   

所以你现在拥有的(使用子查询)是最佳的,没有理由重写它。

参考