2017-09-29 12 views
0

オブジェクトを照会し、そのリスト属性をソート済みリストに戻す最良の方法は何ですか?Hibernate - 内部クエリリスト(またはList in List)をソートする方法は?

例:名前でと説明が発注StateItemのリスト(各項目について)注文した商品のリスト:もたらすことによって、グループのクエリを行うための最善の方法は何であるか、以下のシナリオでは、与えられた

StateObject?

public class Group { 

    // ... 

    @Fetch(FetchMode.JOIN) 
    @OneToMany(mappedBy = "group") 
    private List<ItemGroup> itemList; 

    // ... 
} 

public class ItemGroup { 

    // ... 

    @JoinColumn(name="ID_GROUP", referencedColumnName="ID_GROUP") 
    @ManyToOne 
    private Group group; 

    @Fetch(FetchMode.JOIN) 
    @OneToMany(mappedBy = "item") 
    private List<StateItem> stateList; 

    // ... 
} 

public class StateItem { 

    // ... 

    @JoinColumn(name="ID_ITEM", referencedColumnName="ID_ITEM") 
    @ManyToOne 
    private ItemGroup item; 

    @JoinColumn(name="CD_STATE", referencedColumnName="CD_STATE") 
    @ManyToOne 
    private StateObject state; 

    // ... 

} 

public class StateObject { 

    // ... 

    @Column(name="DE_STATE_OBJECT", length=255) 
    private String description; 

    // ... 
} 

PS:StateObjectの例のように、子属性でソートする必要があるため、@OrderByを使用できないと思います。 @SortNaturalまたは@SortComparatorを使用したソリューションは、パフォーマンスがありません。 HQLまたはCriteriaのみを使用してその作業を行うことはできますか?

+0

親クラスに '@ NamedQuery'を書き込む方がよいでしょう。 –

答えて

0

StateItemが同等である場合は[email protected]を使用するか、[email protected]を使用してコンパレータを使用できます。

注:この解決策は、SQL SELECT中に適用される(@OrderByによって提供される)注文とは異なるメモリ内ソートを行います。

+0

はい。私はこれがうまくいくと思いますが、パフォーマンスのために大きなリストには適していません。 –

0

Comparator<T>を実装するクラスのデフォルト値を受け入れる@SortComparatorアノテーションを使用することをお勧めします。

@Fetch(FetchMode.JOIN) 
@SortComparator(StateItemComparator.class) 
@OneToMany(mappedBy = "item") 
private List<StateItem> stateList 

このメソッドは、比較戦略を定義する必要があります。

public class StateItemComparatorComparator implements Comparator<StateItem> { 
    @Override 
    public int compare(StateItem s1, StateItem s2) { 
     return b1.getState().getDescription().compareTo(b2.getState().getDescription()); 
    } 
} 
関連する問題