【问题标题】:How to avoid old style outer join (+) in Hibernate?如何避免 Hibernate 中的旧式外连接(+)?
【发布时间】:2012-09-22 09:04:49
【问题描述】:

我写过这样的 HQL 查询:

SELECT a FROM A a LEFT JOIN a.b where ...

Hibernate 生成这样的 sql 查询:

SELECT a FROM A a LEFT JOIN a.b where a.b_id = b.id(+)

但是当我写这样的东西时:

SELECT a FROM where a.b.id > 5

生成 SQL:

SELECT a.* FROM A b cross join B b where b.id > 5

所以当我结合这些方法时,我会收到 Oracle 错误:

SQL Error: 25156, SQLState: 99999
ORA-25156: old style outer join (+) cannot be used with ANSI joins

那么有没有办法告诉 Hibernate 我只想接收一种类型的查询(旧式或新式)?

更新: 通过组合我的意思是像这样的 HQL 查询:

SELECT alarm FROM Alarm as a LEFT JOIN alarm.madeBy as user where user.name = 'George' and a.source.name = 'UFO'

所以这里我指定 Alarm 应该通过 LEFT JOIN 与 User 连接,而不是指定如何将 AlarmSource 连接,因此 Hibernate 会将其与 Cross Join 连接起来。

SQL Query 会是这样的:

FROM Alarms a, Users u cross join Sources s where a.user_id = u.user_id(+) and a.source_id = s.source_id and u.name = 'George' and s.name = 'UFO'

为了更多的理解,我将添加警报实体的小例子:

@Entity
@Table(name = 'Alarms')
public class Alarm {
   @Id
   private BigDecimial id;

   @ManyToOne
   @JoinColumn(name = "user_id")
   private User madeBy;

   @ManyToOne
   @JoinColumn(name = "source_id")
   private Source source;
}

【问题讨论】:

  • 结合这些方法是什么意思?
  • 请显示“组合”方法的一些代码。

标签: java hibernate hql


【解决方案1】:

所以这个问题的解决就是将hibernate的Dialect设置为org.hibernate.dialect.Oracle9Dialect

<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>

【讨论】:

    【解决方案2】:

    我了解到您尝试使用 HQL 获取下面的 SQL 查询。

    SELECT a.* FROM A ,B where a.b_id = b.id(+) and b.id > 5
    

    首先,您不应该在 HQL 中使用像 a.b.XX 这样的代码。
    示例代码是

    SELECT a FROM A a LEFT JOIN a.b where b.id is null or (b.id is not null and b.id > 5)
    

    然后 hibernate 生成一个不会导致异常的 SQL 查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2015-11-16
      • 2014-11-18
      • 2019-09-13
      相关资源
      最近更新 更多