如何在Hibernate中避免旧式外连接(+)?

时间:2012-10-01 13:47:11

标签: java hibernate hql

我写过这样的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'

所以在这里我指定警报应该与LEFT JOIN连接用户,而不是指定如何连接警告来源,所以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;
}

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

据我所知,您尝试使用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查询。