订单@ManyToMany连接的ResultList

时间:2014-02-06 08:39:06

标签: java rest jpa

我有一个带有临时表的@ManyToMany连接 表1具有0 .. *表2和表2 0 .. *表1 当我要求Table1的元素并将其序列化时。我得到一个包含Table2数组的Table1数组。 Table1的数组按主键排序。但是表1中的Array Table2是随机排序的。

如何通过主键对表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;
}

获取Table1

@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();

}

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的要求,您希望Collection中的Items PersonDetail1已排序。

您可以使用OrderBy注释或OrderColumn注释。

OrderBy可用于动态排序,这意味着将在查询结果上进行排序。

OrderColumn可用于持久排序 - 项目的顺序将存储在Item表的列中。持久性排序有一些怪癖,因此对于大多数需求,我会选择OrderBy

我有点怀疑订购会对常规Set的内容产生任何影响。您可能希望使用排序Collection的实施,例如SortedSet

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

默认排序为ASC,因此您无需明确编写,我这样做是为了说明目的。