如何在Hibernate中避免旧式外连接(+)? [英] How to avoid old style outer join (+) in Hibernate?

查看:105
本文介绍了如何在Hibernate中避免旧式外连接(+)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经编写了HQL查询,如下所示:

 选择一个FROM A LEFT JOIN ab where ... 

Hibernate生成这样的sql查询:

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

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

  SELECT a FROM where abid> 5 

它生成SQL:

  SELECT a。* FROM A b交叉连接B b where b.id> 5 

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

  SQL错误:25156,SQLState:99999 
ORA-25156:旧式外连接(+)不能与ANSI连接一起使用

那么有什么方法可以对Hibernate说我只想接收一种类型的查询(旧式或新式)?



更新:
结合我的意思是HQL查询是这样的:

 选择闹钟从闹钟作为一个左连接alarm.madeBy as user user.name ='George'and a.source.name ='UFO'

因此,我在此指定警报应与用户连接,并且不指定如何将警报 连接,因此Hibernate会将其与Cross Join连接起来。



SQL Query将如下所示:

  FROM Alarms a ,用户你交叉连接源s其中a.user_id = u.user_id(+)和a.source_id = s.source_id和u.name ='George'和s.name ='UFO'

$ b $ p




$ b $ p $为了更多的理解,我将添加一个小实例的Alarm实体:

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

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

@ManyToOne
@JoinColumn(name =source_id)
私人来源;


解决方案

将hibernate的Dialect设置为org.hibernate.dialect.Oracle9Dialect

 < property name =hibernate.dialect> org。 hibernate.dialect.Oracle9Dialect< /性> 


I've wrote HQL query like this:

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

Hibernate generate sql query like this:

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

But when I write something like this:

SELECT a FROM where a.b.id > 5

It generate SQL:

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

So when I combine this approaches I recieve Oracle ERROR:

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

So is there way to say to Hibernate that I want receive only one type of queries (old style or new) ?

UPDATE: By combining I mean HQL query like this:

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

So here I specify that Alarm should be connected with User with LEFT JOIN, and not specify how connect Alarm with Source, so Hibernate will connect it with Cross Join.

And SQL Query will be like this:

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'

For more understanding I will add small example of Alarm Entity:

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

解决方案

So the solving of this problem is set hibernate's Dialect to org.hibernate.dialect.Oracle9Dialect

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

这篇关于如何在Hibernate中避免旧式外连接(+)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆