2017-09-29 6 views
0

개체를 쿼리하고 정렬 된 목록에서 해당 목록 특성을 반환하는 가장 좋은 방법은 무엇입니까?최대 절전 모드 - 내부 쿼리 목록 (또는 목록에서 정렬)을 정렬하는 방법?

예 : 이름 및 설명에 의해 주문 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; 

    // ... 
} 

추신 : 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()); 
    } 
}