gpt4 book ai didi

java - 如何避免 Hibernate 中的旧式外部连接(+)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:43 28 4
gpt4 key购买 nike

我写过这样的 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,而不是指定Alarm如何连接到Source ,因此 Hibernate 会将其与 Cross Join 连接起来。

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

最佳答案

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

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

关于java - 如何避免 Hibernate 中的旧式外部连接(+)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674565/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com