阅读 191

关于@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


    文章分类
    代码人生
    版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
    相关推荐