2014-02-06 75 views
0

我有一個@ManyToMany連接與臨時表。
表1具有0 .. *表2和表2 0 .. *表1。
當我要求表1的元素和序列化它。我得到一個包含Table2數組的Table1數組。 Table1的數組按主鍵排序。但是表1中的數組表2是隨機排序的。訂購@ManyToMany連接的ResultList

如何排序表1中的Table2的數組的主鍵?

CODE:

表1

@Table(name = "Person") 
@Entity 
public class PersonDetail1 extends Person implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "PERSON_ITEM", joinColumns = {@JoinColumn(name = "PERS_FK", referencedColumnName = "PERS_PK")}, inverseJoinColumns = {@JoinColumn(name = "ITEM_FK", referencedColumnName = "ITEM_PK")}) 
    private Set<Item> items; 
} 

表2

@Entity 
public class Item implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "ITEM_PK") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "PERSON_ITEM", joinColumns = {@JoinColumn(name = "ITEM_FK", referencedColumnName = "ITEM_PK")}, inverseJoinColumns = {@JoinColumn(name = "PERS_FK", referencedColumnName = "PERS_PK")}) 
    private Set<PersonDetail1> personen; 
} 

得到表1

@Override 
public List<PersonDetail1> getPersonen() throws DetailException { 

    TypedQuery<PersonDetail1> q = em.createQuery("SELECT x from PersonDetail1 x", PersonDetail1.class); 
    return q.getResultList(); 

} 

得到序列化對象

@GET 
@Path("/personen") 
@Produces(MediaType.APPLICATION_JSON) 
@Override 
public Response getPersonen(){ 

    return Response.status(Response.Status.OK).entity(persService.getPersonen()).build(); 

} 
+0

您是否嘗試過使用ORDER BY? – kostja

+0

是的,但我不知道它退出了。 – Claudia

+0

我沒有問題訂購我的查詢「正常」。像:「SELECT x從PersonDetail1 x ORDER BY x.id asc ...但是如何在列表中排列列表? – Claudia

回答

0

如果我理解您的要求正確,你想擁有的Items在排序的PersonDetail1Collection。您可以使用OrderBy註釋或OrderColumn註釋。

OrderBy可用於動態排序,這意味着排序將發生在查詢結果上。

OrderColumn可用於持久性排序 - 這些項目的順序將存儲在Item表的一列中。持久訂購有一些怪癖,所以對於大多數需求我會去OrderBy

我有一些疑慮,排序會對正常Set的內容有任何影響。您可能想要使用排序的Collection實現,如SortedSet

@OrderBy("id ASC") 
private Set<Item> items; 

默認排序是ASC,這樣你就不會需要它明確寫,我這樣做是爲了說明目的。