我写了这样的 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 我只想接收一种类型的查询(旧式或新式)?
UPDATE:我所说的组合是指像这样的 HQL 查询:
SELECT alarm FROM Alarm as a LEFT JOIN alarm.madeBy as user where user.name = 'George' and a.source.name = 'UFO'
所以在这里我指定Alarm应该连接到User使用 LEFT JOIN,并且不指定如何连接Alarm with 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;
}