2017-08-31 11 views
1

親オブジェクトのリストを、子の値である のセットでソートしようとしています。それでは、私はFFを持っているとしましょう:親オブジェクトをその設定された子の値で並べ替える

子供の名前を持つ親1は、アバの子供の名前、ゼオン、最大で子供の名前カメオ
Parent3で
Parent2上昇しました。

降順に並べ替えると、最初にParent3が表示されるはずです。それだけで罰金、それは複数の同じ親を選択するが、それを取得し、明確ななければ

SELECT DISTINCT p FROM Parent p JOIN p.children c ORDER BY c.name desc 

: これは1> 2> 3の間違った結果を取得し、私の現在のHQLです。

私は以下のようなモデルの設定があります。

public class Parent { 
private Set<Child> children = new HashSet<Child>(); 
} 

public class Child{ 
    private String name; 

} 

編集:両方の親が同じchildren.name値を持っている場合、それは次の可能な値を比較しませんが、それをHQL order by within a collectionをソートするために管理します。私。

親1は、アバの子供がいる場合は、日本ゼオン
Parent2はアバ子供を持って、カメオ
昇順は、最初Parent2に優先順位をつける必要があります。

+1

これは[hql-order-by-a-collection](https://stackoverflow.com/questions/666423/hql-order-by-within-a-collection)ですでに回答済みです助けて –

+0

@ジョージ両親が同じchildren.name値を持っていても、次の名前の値を比較しませんが、両方ともacaciaという名前の子を持っていますが、昇順を仮定して、可能な最も早い値を見つけるまで何か – Rian

答えて

0

親の複製を望まない場合は、コレクションではできません。あなたが行うことができるのは、親を選択し、各親の中の最大要素(アルファベット順)を選択してそれを順序付けることです。

これらの行の周りに何かがあります。

select p from Parent p 
where p.maxChild = 
    (select max(c.name) from Child c where c.parentID=p.parentID) 

@Formulaを使用して、必要に応じてmax要素をマップできます。したがって、コレクションをまったく使用するのは本当にネセサリーではありません。

実際には、式を使用するとさらに優れている場合があります。コレクションを一切取り出すことなく、最大の名前とその順序を直接マップできます。

関連する問題