Hibernate - 如何对内部查询列表(或列表中的列表)进行排序?

问题描述 投票:0回答:2

查询对象并以排序列表返回其列表属性的最佳方法是什么?

示例:

考虑到下面的场景,进行组查询的最佳方法是什么,通过引入:按名称排序的项目列表和(对于每个项目)按 StateObject 的描述排序的 StateItem 列表?

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 的解决方案并不具有性能。 我可以仅使用 HQL 或 Criteria 来完成这项工作吗?

java hibernate sorting sql-order-by
2个回答
0
投票

如果

org.hibernate.annotations.@SortNatural
实现了可比较,则可以使用
StateItem
,或者您可以使用
org.hibernate.annotations.@SortComparator
并提供比较器。

注意:此解决方案执行内存排序,这与 SQL SELECT 期间应用的排序(由

@OrderBy
提供)不同。


0
投票

我建议您使用 @SortComparator 注释,它接受实现

Comparator<T>
的类的默认值。

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

其方法应定义比较策略。

public class StateItemComparatorComparator implements Comparator<StateItem> {
    @Override
    public int compare(StateItem s1, StateItem s2) {
        return b1.getState().getDescription().compareTo(b2.getState().getDescription());
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.