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

Div*_*ers 6 java hibernate hql

我写过像这样的HQL查询:

SELECT a FROM A a LEFT JOIN a.b where ...
Run Code Online (Sandbox Code Playgroud)

Hibernate生成如下的sql查询:

SELECT a FROM A a LEFT JOIN a.b where a.b_id = b.id(+)
Run Code Online (Sandbox Code Playgroud)

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

SELECT a FROM where a.b.id > 5
Run Code Online (Sandbox Code Playgroud)

它生成SQL:

SELECT a.* FROM A b cross join B b where b.id > 5
Run Code Online (Sandbox Code Playgroud)

因此,当我结合这些方法时,我收到Oracle错误:

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

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

更新: 通过组合,我的意思是HQL查询,如下所示:

SELECT alarm FROM Alarm as a LEFT JOIN alarm.madeBy as user where user.name = 'George' and a.source.name = 'UFO'
Run Code Online (Sandbox Code Playgroud)

所以这里我指定Alarm应该与User with LEFT JOIN连接,而不是指定如何连接Alarm with Source,所以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'
Run Code Online (Sandbox Code Playgroud)

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

@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;
}
Run Code Online (Sandbox Code Playgroud)

Div*_*ers 8

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

<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
Run Code Online (Sandbox Code Playgroud)