@OnetoMany关系映射的排序问题,使用注解@OrderBy

 

Spring里面一对多的关系可以用@OnetoMany注解来实现

然后在实际使用中,如果要对从属对象按条件排序该怎么处理呢?可以用注解来实现的也就是@OrderBy

来看看我的这个例子

一个Product对象,里面有个OnetoMany关系对应到多张图片,然后我这个图片在后台要支持排序,所以我就在Picture这个类里面加了一个ordernum的int型字段来进行排序标记

@OneToMany(cascade = CascadeType.ALL,mappedBy = "product",fetch = FetchType.EAGER)
private List<Picture> pictures;

然后我在取值的时候怎样才能让图片按照我的要求来进行排序呢

就是使用@OrderBy

看一下具体是怎么使用

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface OrderBy { 
 /**
  * An <code>orderby_list</code>.  Specified as follows:
  *
  * <pre>
  *    orderby_list::= orderby_item [,orderby_item]*
  *    orderby_item::= [property_or_field_name] [ASC | DESC]
  * </pre>
  *
  * <p> If <code>ASC</code> or <code>DESC</code> is not specified,
  * <code>ASC</code> (ascending order) is assumed.
  *
  * <p> If the ordering element is not specified, ordering by
  * the primary key of the associated entity is assumed.
  */
  String value() default "";
}

通过这个注解的定义可以看出它的参数就是一个String

比如我项目里按照图片的ordernum升序排列就是@OrderBy("ordernum ASC");ordernum是字段名 ASC对应排序方式,中间用空格隔开

当然也支持多个条件进行排序,比如我要通过ordernum和id进行,那就是@OrderBy("ordernum ASC,id ASC")

最后我的代码

@OneToMany(cascade = CascadeType.ALL,mappedBy = "product",fetch = FetchType.EAGER)
@OrderBy("ordernum ASC")
private List<Picture> pictures;

 

Entity One-to-Many 排序设置

/**
* 评论实体类,对应 TCOMMENT 表。
* @author William
*/
@Entity
@Table(name = "TCOMMENT")
public class Comment {

/**
* 标识ID字段为主键,主键生成策略为:自动。
*/
@Id @GeneratedValue
private Long id;
private String nickname;
private String content;
private Integer note;
/**
* 发表日期,对应 posted_date 字段,字段类型为TIMESTAMP。
*/
@Column(name = "posted_date")
@Temporal(TemporalType.TIMESTAMP)
private Date postedDate;

// Constructors, setters, getters
}
/**
* 新闻实体类,对应 News表。
* @author William
*/
@Entity
@NamedQuery(name = "findAllNews", query = "SELECT n FROM News n")
public class News {

/**
* 标识ID字段为主键,主键生成策略为:自动。
*/
@Id @GeneratedValue
private Long id;
/**
* content新闻内容,该字段必填。
*/
@Column(nullable = false)
private String content;
/**
* comments评论,与之进行一对多关联。<br/>
* FetchType.EAGER 获取新闻时立即相关评论。<br/>
* CascadeType.ALL 支持所有级联操作。<br/>
* OrderBy 获取评论列表时,按照postedDate(发表日期)降序排列。
*/
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinTable(name = "NEWS_COMMENT", joinColumns = @JoinColumn(name = "NEWS_ID"),
inverseJoinColumns = @JoinColumn(name = "COMMENT_ID"))
@OrderBy("postedDate DESC")
private List<Comment> comments; 
// Constructors, setters, getters
}
CREATE TABLE TCOMMENT (
ID BIGINT,
NICKNAME VARCHAR(50),
CONTENT VARCHAR(500),
NOTE INT,
POSTED_DATE TIMESTAMP,
PRIMARY KEY (ID)
);

CREATE TABLE NEWS (
ID BIGINT,
CONTENT VARCHAR(500),
PRIMARY KEY (ID)
);

CREATE TABLE NEWS_COMMENT (
NEWS_ID BIGINT,
COMMENT_ID BIGINT,
PRIMARY KEY (NEWS_ID, COMMENT_ID),
FOREIGN KEY (NEWS_ID) REFERENCES NEWS(ID),
FOREIGN KEY (COMMENT_ID) REFERENCES TCOMMENT(ID)
);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程宝库

 工具准备相同大版本的jdkideafernflower.jarjavassist.jar 或 本地下载地址jd-gui 或 本地下载地址 三种方式1.使用fernflower反编译之后再编译把要 ...