2017-09-29 33 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; 

    // ... 
} 

PS:我觉得我不能使用@OrderBy因为我有排序子节点属性,如StateObject例子。 而@SortNatural或@SortComparator的解决方案不是performatic。 我可以仅使用HQL或Criteria来完成这项工作吗?

+0

最好在父类中编写'@ NamedQuery'。 –

回答

0

如果StateItem实现可比或者您可以使用[email protected]并提供比较器,则可以使用[email protected]

注意:此解决方案执行的内存中排序与在SQL SELECT期间应用的排序不同(在@OrderBy中提供)。

+0

是的。我认为这是有效的,但由于性能原因,它不适合大型列表。 –

0

我建议您使用@SortComparator注释,该注释接受默认值Comparator<T>的类。

@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()); 
    } 
}