15

クラスとオプションの関係をOffer持つクラスがあります。そのため、一部のオファーの記事プロパティは値を保持します。Articlenull

次のステートメントを使用すると、すべてが正常に機能します。記事がないものも含めて、すべてのオファーを受け取りました。

SELECT o FROM Offer o 
         LEFT OUTER JOIN o.article a 
         LEFT OUTER JOIN o.vendor v 
         WHERE v.number = '0212' OR a.nummer = '123456'

ステートメントを次のように変更した場合:

SELECT o FROM Offer o 
         LEFT OUTER JOIN o.article a 
         LEFT OUTER JOIN o.vendor v 
         WHERE v.number = '0212' OR o.article.nummer = '123456'

とは異なる記事を持つこれらのオファーのみを取得しましたNULL。これは、暗黙的な結合(o.article.nummer)の表記により、内部結合が強制されるためです。

左外部結合を暗黙的な結合(注釈駆動型など)に強制する可能性はありますか?機会があれば、次のような短い形式を使用できます。

SELECT o FROM Offer o 
         WHERE v.number = '0212' OR o.article.nummer = '123456'
4

4 に答える 4

5

@Fetch(FetchMode.JOIN)Article プロパティを試してみることができます。ただし、これは Hibernate アノテーションです。

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

//...

@ManyToOne
@Fetch(FetchMode.JOIN)
Article article;
于 2012-03-06T19:17:49.753 に答える
1

私が掘り下げることができる限り、HibernateはHQL クエリの関連付け結合のデフォルトの暗黙的な形式を変更する方法を提供していません。

私が自分で見つけた最善の解決策は次のとおりです。

  • 明示的な結合情報を使用してクエリを作成します。
  • Criteria を使用します。これは、動的クエリの構築におそらく最適です。
于 2014-03-26T18:27:03.833 に答える
1

同様の問題がありました: Column を含むある種のGeneralFacility-Table がありましたSpecificType。すべての施設がこのタイプを持っているわけではなく、SpecificType が GeneralFacility-Table エントリで内部結合されているため、特定のタイプがテーブルに該当しませんでした。

置くことで問題を解決しました

    @Fetch(FetchMode.SELECT)

@ManyToOneモデルの - 行の横。タイプは別のクエリでフェッチされ、それが何も返さない場合、GeneralFacility クエリの結果は破棄されません。

于 2016-04-13T07:25:23.747 に答える
0

まず、a.nummer の代わりに o.article.nummer を使用しようとすると、内部結合を使用して余分な WHERE 句が挿入されると思います。左結合を明示的に言う方法はありません。ただし、とにかくクエリで自分で指定しているので、エイリアス a.number = '23456' の結合エンティティを使用してください。

フィールドがヌル可能であることがわかっているため、ヌル可能フィールドの SQL で = を使用できないのと同様に、= を使用することはできません。代わりに COALESCE を使用して、この目的のために NULL 値を空の文字列に変換します。

SELECT o FROM Offer o 
    LEFT OUTER JOIN o.article a
    LEFT OUTER JOIN o.vendor v 
        WHERE v.number = '0212'
        OR COALESCE(a.nummer,'') = '123456'
于 2014-10-26T12:50:47.873 に答える