当我持有包含订单的列表时,数据库中的结果具有不同的顺序。如何在JPA中保持与列表顺序的多对多关系?
@Entity
@Table(name = "house")
public final class House {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic(optional = false)
@Column(name = "name")
private String name
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "house_room",
joinColumns =
@JoinColumn(name = "id_house", referencedColumnName = "id"),
inverseJoinColumns =
@JoinColumn(name = "id_room", referencedColumnName = "id"))
private List<Room> rooms;
}
众议院对象:
Room room1 = new Room();
room1.setName("Kitchen");
Room room2 = new Room();
room2.setName("Bathroom");
Room room3 = new Room();
room3.setName("Bedroom");
List<Run> runs = new ArrayList<Run>();
rooms.add(0,room2);
rooms.add(1,room1);
rooms.add(2,room3);
House cottage = new House();
cottage.setRooms(rooms);
persist(cottage); // order in database should be "room2", "room1" then "room3" but it is saved as "room1", "room2" then "room3"
答案 0 :(得分:6)
有两种方法可以使用@OrderBy和@OrderColumn注释在JPA中订购列表。 @OrderColumn也许就是你要找的。 p>
<强> @OrderBy 强>
根据实体或元素的特定属性的比较
指定排序规则示例:
@OrderBy("name ASC")
private List<Room> rooms;
通过在映射上添加@OrderBy注释,我们可以指示我们希望按名称属性按字母顺序升序排序房间。 注意:我们不需要在@OrderBy注释中包含ASC,因为默认情况下它会升序。
只需更改内存中List的项目顺序,就不会导致该命令在提交时存储在数据库中。
仅在从数据库中检索集合时才应用注释。这意味着,订单不会存储在数据库中,但是当从数据库中检索数据并将数据存储到内存中的List集合时,它们将被订购。
<强> @OrderColumn 强>
OrderColumn批注指定用于维护列表的持久顺序的列。例如:
@OrderColumn(name="ROOM_ORDER")
private List<Room> rooms;
这意味着您还有一个名为“ROOM_ORDER”的附加列,用于指示表格中商品的顺序。
答案 1 :(得分:0)
关系数据库不存储引用数据的顺序。为了将元素的顺序存储在列表中,JPA需要DB表中的另一列。您可以使用@JoinColumn
以相同的方式映射列@OrderColumn
(您只需要单@JoinColumn
,即使您使用了多个.c
注释)