我有一个@ManyToMany映射,其中表通过映射表自引用,我们想要在实际映射表中对订单ID进行排序,但发现很难配置它。
我们可以在hibernate xml中执行它,因此很自然地假设JPA注释中存在支持。有人知道我们如何对映射表中的值进行排序吗?
表格是:
wap_site_components
intid
strname
intcomponentdef
dtmcreated
intcustomer
和自引用的映射表是:
wap_site_component_relations
intid
intparent (references intid in wap_site_components)
intchild (references intid in wap_site_components)
intorder (this is the value we want to order the collection on)
在Hibernate Annotations中我们有:
@ManyToMany (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable (name = "wap_site_component_relations",
joinColumns = {@JoinColumn (name = "intparent", referencedColumnName = "id") },
inverseJoinColumns = {@JoinColumn (name = "intchild", referencedColumnName = "id") })
public Set<WapComponent> getChildren() {
return children;
}
这就是我们在hibernate xml中执行它的方式:
<set
name="children"
table="wap_site_component_relations"
lazy="true"
cascade="none"
sort="unsorted"
order-by="intorder"
mutable="false"
>
<cache
usage="read-only"
/>
<key
column="intparent"
>
</key>
<many-to-many
class="se.plusfoursix.im46.data.wap.WapComponent"
column="intchild"
outer-join="auto"
/>
</set>
所以我们想要使用@OrderBy标记但不能引用映射表中的intorder值。有任何想法吗?感谢。
(我们在代码中对子集合尝试了一个@OrderBy(intorder),但这对我们来说没有用)
答案 0 :(得分:2)
您可以创建一个带注释的对象来表示链接表,然后使用@oneToMany从父级映射到子链接,然后映射到子级
@Entity
public class Parent {
@id
Long id;
@OneToMany(targetEntity = ChildLink.class)
Set<ChildLink> childLinks;
}
public class ChildLink {
@Id
@OrderBy
Long orderBy;
@ManyToOne
Set<Parent> parents;
@ManyToOne
Set<Child> children;
}
只是一个粗略的例子。然后,您可以以编程方式从childLink集合中生成集合子集,可能在父类的getChildren方法中。
答案 1 :(得分:0)
我们最终只是将映射表创建为bean。
如果有人在没有这种情况下有办法执行上述操作,仍然很乐意收到你的来信!
答案 2 :(得分:0)
可以使用 @OrderColumn
完成http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html?is-external=true
@Entity
public class CreditCard {
@Id long ccNumber;
@OneToMany // unidirectional
@OrderColumn
List<CardTransaction> transactionHistory;
...
}