私は次のように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 に 1 つのタイプのクエリ (古いスタイルまたは新しいスタイル) のみを受け取りたいと言う方法はありますか?
更新: 組み合わせるとは、次のような 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を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;
}