Play Framework: Inheritance sort by type

前端 未结 1 1008
终归单人心
终归单人心 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 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 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 find = new Finder<>(Long.class, Post.class);
    
        public Date publishDate;
    
    }
    

    So you can choose all contents via:

    List 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)
提交回复
热议问题