0

次のクラスがあります(わかりやすくするために簡略化しています):

Class Top {
  InternationalStringType name;
}

Class InternationalStringType {
  List<LocalizedStringType> localizedString; 
}

Class LocalizedStringType {
  String value;
}

次の EJBQL クエリは、サブオブジェクトが設定された Top のすべてのインスタンスを正常に取得します。

SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls

結果が Top.name.localizedString.value でソートされるように上記のクエリを変更したいと思います

これを行う正しい構文は何ですか? 次のクエリを試しましたが、「エラー: SELECT DISTINCT の場合、ORDER BY 式を選択リストに含める必要があります」というメッセージが表示されます。

SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC

ORDER BY 句の選択リストに何を入れるかは私にはわかりません。

以下は、コンマの後に何を入れても、Object(t) の後の「、」にエラーを与えます。

SELECT DISTINCT Object(t), Object(nm_ls) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC

関連する場合、私の JPA 実装は hibernate 3.6.4.Final です。あなたの助けのためのTIA。

4

2 に答える 2

0

SELECT句のDISTINCT修飾子を削除するだけで、ORDERBY句をクエリで機能させることができました。細かい点がわかりませんが、次の変更されたクエリは完全に機能しました。

SELECT t FROM Top t LEFT JOIN t.name nm LEFT JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC

これで、期待どおりにTop.name.localizedString.value属性でソートされたTopインスタンスを含む結果セットが得られます。

さて、DISTINCTが機能しない理由を誰かが説明できれば、それは素晴らしいことです。ありがとう。

于 2013-03-06T22:47:30.167 に答える
0

ORDER BY 句で使用されるフィールドは CMP フィールドである必要があり、エンティティ識別子または CMR フィールドであってはなりません。さらに、ORDER BY 句で指定する CMP フィールドに注意する必要があります。クエリがエンティティのコレクションを選択する場合、ORDER BY 句は、選択されたエンティティ タイプの CMP フィールドでのみ使用できます。たとえば、次のクエリは不正です。ORDER BY 句で使用される CMP フィールドは、選択されたエンティティ タイプのフィールドではないためです。

SELECT OBJECT( c ) FROM Customer AS c ORDER BY c.address.city

city CMP フィールドは Customer EJB の直接の CMP フィールドではないため、ORDER BY 句では使用できません。ORDER BY 句で使用できる唯一の CMP フィールドは、選択されているエンティティ タイプの直接 CMP フィールドです。これは不当な制限です。

同様の制限が CMP 結果にも適用されます。ORDER BY 句で使用される CMP フィールドは、SELECT 句で識別される CMP フィールドと同じである必要があります。たとえば、次のクエリは、SELECT 句で識別される CMP が ORDER BY 句で使用されるものと異なるため、不正です。

SELECT c.address.city FROM Customer AS c ORDER BY c.address.state

上記のクエリでは、州ごとに並べられたすべての都市のリストが必要でした。残念ながら、これは違法です。都市 CMP フィールドを使用して選択している場合、都道府県 CMP フィールドで注文することはできません。

この 2 番目の制限は、主要な RDBS システムの 1 つの制限によって強制された可能性があると聞いています。このシステムでは、select 句に存在しない列で順序付けすることはできません。EJB QL はネイティブ クエリ言語にコンパイルされていることを思い出してください。 RDBS では SQL です。主要なベンダーの制限は、抽象化を作成する際の要因になります。最小公分母が優先されます。

于 2013-03-06T05:52:28.630 に答える