7

私は次のように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 で接続する必要があることを指定し、AlarmSource に接続する方法を指定しないので 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;
}
4

2 に答える 2

11

したがって、この問題を解決するには、hibernate の Dialect を org.hibernate.dialect.Oracle9Dialect に設定します。

<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
于 2012-10-02T04:46:52.973 に答える
0

HQL を使用して以下の SQL クエリを取得しようとしているとのことですが、

SELECT a.* FROM A ,B where a.b_id = b.id(+) and b.id > 5

まず、HQL でabXXのようなコードを使用しないでください。
サンプルコードは

SELECT a FROM A a LEFT JOIN a.b where b.id is null or (b.id is not null and b.id > 5)

その後、hibernate は例外を引き起こさない SQL クエリを生成します。

于 2014-01-16T08:10:00.380 に答える