【发布时间】:2016-03-21 14:14:48
【问题描述】:
这是我的模型:
@Entity
@Table(name = "parent")
public class Parent {
...
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, cascade = { CascadeType.REMOVE}, mappedBy = "parent")
@MapKeyColumn(name = "key")
private Map<String, Child> children;
...
}
@Entity
@Table(name = "child")
public class Child {
...
@Column(name = "key")
private String key;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Parent parent;
@Column(name = "property")
private String property;
...
}
该映射很有用,可用于插入、更新、删除和选择实体。
现在我必须根据映射键使用其 children 属性来订购 Parent 实体,类似于 order by parent.children[<particular key>].property asc 子句(我在 HQL 中没有找到)。我也不知道如何使用 Criteria API 来实现这一点。有什么想法吗?
我现在唯一的解决方案是选择按key 过滤并按property 排序的子项,然后在Java 代码中一一获取父项,即使设置了“获取父项”也效率不高。
【问题讨论】:
-
我不知道它是否有效,但是您是否尝试过在
Parent.children上添加@OrderBy注释?那么它应该是@OrderBy("property asc")。 -
注解类型OrderBy:指定在检索关联或集合时集合值关联或元素集合的元素的排序。似乎不是我的情况,因为用于对映射集合中的项目进行排序
-
由于
Map没有内在顺序,我怀疑使用 JPA 是否可行,因为您不能指定 Hibernate 应该使用可排序的Map作为实现。