查询对象并以排序列表返回其列表属性的最佳方法是什么?
示例:
考虑到下面的场景,进行组查询的最佳方法是什么,通过引入:按名称排序的项目列表和(对于每个项目)按 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 来完成这项工作吗?
如果
org.hibernate.annotations.@SortNatural
实现了可比较,则可以使用 StateItem
,或者您可以使用 org.hibernate.annotations.@SortComparator
并提供比较器。
注意:此解决方案执行内存排序,这与 SQL SELECT 期间应用的排序(由
@OrderBy
提供)不同。
我建议您使用 @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());
}
}