Play Framework: Inheritance sort by type

前端 未结 1 988
终归单人心
终归单人心 2021-01-17 04:44

In my Application, I have 2 Classes:

- Group
- Model

and one base class Element.

I use the single table strategy to pe

相关标签:
1条回答
  • 2021-01-17 05:30

    Sample base model can look like:

    package models.db;
    
    import play.db.ebean.Model;
    
    import javax.persistence.*;
    import java.util.Date;
    
    @Entity
    @Table(name = "content")
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING)
    @DiscriminatorValue("content")
    public abstract class Content extends Model {
    
        @Id
        public Long id;
    
        @Column(name = "dtype", insertable = false, updatable = false)
        public String dtype;
    
        public static Finder<Long, Content> find = new Finder<>(Long.class, Content.class);
    
        public String title;
        public Date created = new Date();
        public Date modified = new Date();
    
    
    }
    

    Then you can extend it like:

    package models.db;
    
    import javax.persistence.*;
    
    @Entity
    @DiscriminatorValue("news")
    public class News extends Content {
    
        @Id
        public Long id;
        public static Finder<Long, News> find = new Finder<>(Long.class, News.class);
    
        public String newsSource;
    
    }
    

    or

    package models.db;
    
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import java.util.Date;
    
    @Entity
    @DiscriminatorValue("post")
    public class Post extends Content {
    
        @Id
        public Long id;
        public static Finder<Long, Post> find = new Finder<>(Long.class, Post.class);
    
        public Date publishDate;
    
    }
    

    So you can choose all contents via:

    List<Content> contents = Content.find.where().orderBy("dtype ASC").findList();
    

    Of course these objects will have only shared fields: id, dtype, title, created and modified, for getting i.e. (News) newsSource or (Post) publishDate you need to get these objects with their own finders i.e. using id value from general Content query.

    0 讨论(0)
提交回复
热议问题