7

我有一个 @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 标签但不能引用映射表中的inorder 值。有任何想法吗?谢谢。

(我们已经在代码中的 children 集合上尝试了 @OrderBy(intorder) ,但这对我们来说并没有奏效)

4

3 回答 3

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 方法中。

于 2009-05-14T14:11:06.297 回答
0

我们最终只是将映射表创建为一个 bean。

如果有人有办法在没有它的情况下执行上述操作,仍然很高兴收到您的来信!

于 2009-05-15T13:26:11.123 回答
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;
   ...
}
于 2015-05-25T22:25:35.213 回答