【问题标题】:Hibernate - How to sort internal query lists (or List in List)?Hibernate - 如何对内部查询列表(或列表中的列表)进行排序?
【发布时间】:2017-09-29 20:40:53
【问题描述】:

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

例子:

考虑到下面的场景,进行组查询的最佳方法是什么,通过带来:按名称排序的项目列表和(对于每个项目)按 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 来完成这项工作吗?

【问题讨论】:

  • 最好在父类中写@NamedQuery

标签: java hibernate sorting sql-order-by


【解决方案1】:

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

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

【讨论】:

  • 是的。我认为这行得通,但由于性能原因,它对于大型列表不是一个好的解决方案。
【解决方案2】:

我建议您使用@SortComparator 注释,它接受实现Comparator&lt;T&gt; 的类的默认值。

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

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2019-12-19
    • 2020-02-27
    • 1970-01-01
    • 2012-03-22
    • 2016-08-30
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多