列表中的元素按插入顺序排列:
List<Object> list = new ArrayList<>();
list.add(obj);
现在我想将列表存储在带有hibernate
的postgres表中,并希望保留插入顺序。是否可能hibernate获取集合并且它具有与插入前相同的顺序?
答案 0 :(得分:4)
您必须在数据库中保留订单 - 例如,添加映射到order
列的ORDER
属性
从JPA获取实体时,您可以使用@OrderBy注释进行排序
@Entity
@Table(name = "VEHICLE")
public class Vehicle {
// other fields here
@OneToMany(mappedBy = "vehicle")
@OrderBy("vehicle.order ASC")
Set<VehicleImage> vehicleImages;
public void addImage(VehicleImage image) {
if (null == vehicleImages) vehicleImages = new HashSet<>();
image.setSize(vehicleImages.size() + 1);
image.setVehicle(this);
vehicleImages.add(this);
}
}
@Entity
@Table(name = "VEHICLE_IMAGE")
public class VehicleImage{
// other fields here
@Column(name = "ORDER")
private int order;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name="VEHICLE_ID", referencedColumnName = "ID")
Vehicle vehicle;
}
答案 1 :(得分:1)
最后我得到了以下解决方案:
@OneToMany(mappedBy...)
@OrderBy("id")
private Set<MyEntity>list = new LinkedHashSet<>();
@Entity
class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
我的要求是保留插入顺序,这是使用LinkedHashSet
给出的。由于数据库id
是自动生成的并且总是递增的,我可以按生成的ID对该集合进行排序,并在select上获得按原始插入顺序排序的列表。
答案 2 :(得分:0)
看看@OrderColumn或this great article。这样就可以了-在给定的父级(列表集合)的上下文中保持顺序。