http://docs.jboss.org/hibernate/orm/3.6/reference/zh-CN/html_single/
在后面的篇幅中,我们将了解如何List 和Map集合的排序.以及它们在Hibernate映射过程中如何进行排序.
Lists可以以2种不同的方式进行映射
-
作为indexed lists, 这种方法排序的顺序会保持在数据库中.
在内存中对Lists进行排序, 可以使用@javax.persistence.OrderBy. 这个注解的值是以List的属性,值可以有多个并以,隔开.对应的集合也将以这种方式进行排序.
(
比如
firstname asc, age desc
) .如果对应属性在集合中为空, 则集合默认以集合对象的主键id进行排序.
例 7.7. Ordered lists using @OrderBy
@Entity
public class Customer {
@Id @GeneratedValue public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
private Integer id;
@OneToMany(mappedBy="customer")
<span style="background-color: rgb(255, 255, 204);">@OrderBy("number")</span>
public List<Order> getOrders() { return orders; }
public void setOrders(List<Order> orders) { this.orders = orders; }
private List<Order> orders;
}
@Entity
public class Order {
@Id @GeneratedValue public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
private Integer id;
public String getNumber() { return number; }
public void setNumber(String number) { this.number = number; }
private String number;
@ManyToOne
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer) { this.customer = customer; }
private Customer number;
}
-- Table schema
|-------------| |----------|
| Order | | Customer |
|-------------| |----------|
| id | | id |
| number | |----------|
| customer_id |
|-------------|
如果想将排序的索引保存在数据库的字段中,使用@javax.persistence.OrderColumn .注解中可以配置存储排序字段的字段名. 这个字段如果没有设置字段名,默认字段名为引用属性
加上_加order.比如orders_ORDER
例 7.8. Explicit index column using @OrderColumn
@Entity
public class Customer {
@Id @GeneratedValue public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
private Integer id;
@OneToMany(mappedBy="customer")
<span style="background-color: rgb(255, 255, 153);"> @OrderColumn(name="orders_index")</span>
public List<Order> getOrders() { return orders; }
public void setOrders(List<Order> orders) { this.orders = orders; }
private List<Order> orders;
}
@Entity
public class Order {
@Id @GeneratedValue public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
private Integer id;
public String getNumber() { return number; }
public void setNumber(String number) { this.number = number; }
private String number;
@ManyToOne
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer) { this.customer = customer; }
private Customer number;
}
-- Table schema
|--------------| |----------|
| Order | | Customer |
|--------------| |----------|
| id | | id |
| number | |----------|
| customer_id |
| <span style="background-color: rgb(255, 255, 204);">orders_order </span>|
|--------------|
数组和List的排序索引一般都是integer类型(用
<list-index>进行映射 映射在字段中的值默认是以0开始的连续的整数
).
例 7.9. index-list element for indexed collections in xml mapping
<list-index column(1)="column_name" base="(2)0|1|..."/>
| |
|
假若你的表没有一个索引字段,当你仍然希望使用 List
作为属性类型,你应该把此属性映射为 Hibernate <bag>。从数据库中获取的时候,bag 不维护其顺序,但也可选择性的进行排序。