9

左外部結合は、B テーブルに一致するレコードがある場合でも、左テーブルからすべてのデータを取得することになっていますが、左テーブルの right_id 列が null の場合、レコードを取得できません。

もっと説明してる

データ モデル: Order.java では、これは私の LEFT テーブルであり、1 対 1 の関係があります。

@OneToOne(targetEntity = OrderShippingDetail.class, optional=true, cascade = {CascadeType.ALL})
@JoinColumn(name = "SHIPPING_DETAIL_ID", referencedColumnName = "ID")
private OrderShippingDetail shippingDetail;

HQL は次のとおりです。

    hql = "SELECT " +
            "o.id as id, " +
            "o.createTime as createTime, " +
            "o.customerEmailAddress as customerEmailAddress, " +
            "o.customerPhoneNumber as customerPhoneNumber, " +
            "o.customerNote as customerNote, " +
            "o.invoicePrintedFlag as invoicePrintedFlag, " +
            "shippingAddress.address.personName as shippingPersonName, " +
            "shippingDetail.shippingCompany.id as shippingCompanyId, "+
            "shippingDetail.shippingCompany.name as shippingCompanyName, "+
            "shippingDetail.receiptNumber as shippingReceiptNumber, "+
            "shippingDetail.trackingNumber as shippingTrackingNumber, "+
            "shippingDetail.price as shippingPrice, "+
            "o.invoiceNumber as invoiceNumber " + 
        "FROM Order AS o " +
        "LEFT OUTER JOIN o.shippingAddress AS shippingAddress " +
        "LEFT OUTER JOIN o.shippingDetail AS shippingDetail ";

しかし、「SHIPPING_DETAIL_ID」が null でないレコードだけが表示されます。HQLにエラーはありますか?hibernate の実行時に自動的に作成される SQL コマンドをモデル化して作成されます。

私はこれを見つけました、

HQL は、暗黙的な結合と明示的な結合という 2 つの形式の関連結合をサポートしています。

前のセクションで示したクエリはすべて明示的な形式を使用しています。つまり、 from 句で join キーワードが明示的に使用されています。おすすめの形です。

暗黙の形式は join キーワードを使用しません。代わりに、関連付けはドット表記を使用して「逆参照」されます。暗黙的な結合は、どの HQL 句にも表示できます。暗黙的な結合は、結果の SQL ステートメントで内部結合になります。

そして、SELECT 部分のドット表記を削除したので、新しい HQL は次のようになります。

hql = "SELECT " +
                "o.id as id, " +
                "o.createTime as createTime, " +
                "o.customerEmailAddress as customerEmailAddress, " +
                "o.customerPhoneNumber as customerPhoneNumber, " +
                "o.customerNote as customerNote, " +
                "o.invoicePrintedFlag as invoicePrintedFlag, " +
                "shippingDetail, " +
                "o.invoiceNumber as invoiceNumber " + 
            "FROM Order AS o " +
            "LEFT OUTER JOIN o.shippingAddress AS shippingAddress " +
            "LEFT OUTER JOIN o.shippingDetail AS shippingDetail ";

したがって、それは機能し、Order テーブルのすべてのレコードを返しますが、ShippingDetail オブジェクトのすべての列と関係を選択したくありません。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

8

別の明示的な左結合をクエリに追加します。

SELECT o.id as id, 
...,
shippingCompany.id as shippingCompanyId, 
shippingCompany.name as shippingCompanyName, 
...
FROM Order AS o
LEFT OUTER JOIN o.shippingAddress AS shippingAddress 
LEFT OUTER JOIN o.shippingDetail AS shippingDetail
LEFT OUTER JOIN shippingDetail.shippingCompany AS shippingCompany
于 2013-02-07T23:15:12.057 に答える