如何避免旧风格的外Hibernate中加入(+)?(How to avoid old style o

2019-09-23 06:27发布

我写的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将其与交叉连接加入。

和SQL查询将是这样的:

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;
}

Answer 1:

所以这个问题的解决设置休眠的方言来org.hibernate.dialect.Oracle9Dialect

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


Answer 2:

据我所知,您尝试使用下面的HQL获得SQL查询。

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

首先,你不应该使用的代码一样,abXX你的HQL。
示例代码是

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

然后冬眠genarates一个SQL查询,不会导致异常。



文章来源: How to avoid old style outer join (+) in Hibernate?