关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
这篇文章主要介绍了关于@OnetoMany关系映射的排序问题,使用注解@OrderBy,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录
Spring里面一对多的关系可以用@OnetoMany注解来实现
来看看我的这个例子
看一下具体是怎么使用
最后我的代码
Entity One-to-Many 排序设置
Spring里面一对多的关系可以用@OnetoMany注解来实现
然后在实际使用中,如果要对从属对象按条件排序该怎么处理呢?可以用注解来实现的也就是@OrderBy
来看看我的这个例子
一个Product对象,里面有个OnetoMany关系对应到多张图片,然后我这个图片在后台要支持排序,所以我就在Picture这个类里面加了一个ordernum的int型字段来进行排序标记
1 2 | @OneToMany (cascade = CascadeType.ALL,mappedBy = "product" ,fetch = FetchType.EAGER) private List<Picture> pictures; |
然后我在取值的时候怎样才能让图片按照我的要求来进行排序呢
就是使用@OrderBy
看一下具体是怎么使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @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")
最后我的代码
1 2 3 | @OneToMany (cascade = CascadeType.ALL,mappedBy = "product" ,fetch = FetchType.EAGER) @OrderBy ( "ordernum ASC" ) private List<Picture> pictures; |
Entity One-to-Many 排序设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * 评论实体类,对应 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 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /** * 新闻实体类,对应 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 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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) ); |
以上为个人经验,希望能给大家一个参考
原文链接:https://blog.csdn.net/superyxw/article/details/79942919