Jpa 播放框架:按类型排序的继承

Jpa 播放框架:按类型排序的继承,jpa,playframework-2.0,ebean,Jpa,Playframework 2.0,Ebean,在我的应用程序中,我有两个类: - Group - Model 和一个基类元素 我使用单表策略来持久化这些模型(策略=InheritanceType.SINGLE\u表)。因此,在我的表中创建了一列dtype 我现在尝试根据以下类型对我的页面进行排序: find.where().disjunction() .add(Expr.ilike("name", "%" + filter + "%")) .orderBy("dtype as

在我的应用程序中,我有两个类:

- Group
- Model
和一个基类
元素

我使用单表策略来持久化这些模型<代码>(策略=InheritanceType.SINGLE\u表)。因此,在我的表中创建了一列
dtype

我现在尝试根据以下类型对我的页面进行排序:

find.where().disjunction()
                .add(Expr.ilike("name", "%" + filter + "%"))
                .orderBy("dtype asc, name asc," + sortBy + " " + order).findList()
但这会引发一个异常,即找不到数据类型

如何根据类型进行排序


谢谢

示例基础模型可以如下所示:

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();


}
package models.db;
导入play.db.ebean.Model;
导入javax.persistence.*;
导入java.util.Date;
@实体
@表(name=“content”)
@继承(策略=InheritanceType.SINGLE_表)
@鉴别器列(name=“dtype”,鉴别器类型=鉴别器类型.STRING)
@鉴别器值(“内容”)
公共抽象类内容扩展模型{
@身份证
公共长id;
@列(name=“dtype”,insertable=false,updateable=false)
公共字符串数据类型;
publicstaticfinder=newfinder(Long.class,Content.class);
公共字符串标题;
创建的公共日期=新日期();
修改的公共日期=新日期();
}
然后您可以将其扩展为:

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;

}
package models.db;
导入javax.persistence.*;
@实体
@鉴别器值(“新闻”)
公共类新闻扩展了内容{
@身份证
公共长id;
publicstaticfinder=newfinder(Long.class、News.class);
公共字符串新闻源;
}

package models.db;
导入javax.persistence.DiscriminatorValue;
导入javax.persistence.Entity;
导入javax.persistence.Id;
导入java.util.Date;
@实体
@鉴别器值(“post”)
公共类文章扩展了内容{
@身份证
公共长id;
公共静态查找器find=新查找器(Long.class、Post.class);
公开日期发布日期;
}
因此,您可以通过以下方式选择所有内容:

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

当然,这些对象只有共享字段:
id
dtype
title
创建的
修改的
,用于获取即(新闻)
新闻源
或(帖子)
publishDate
您需要使用自己的查找程序获取这些对象,即使用常规内容查询中的
id
值。

Hm,但是如果您在
元素中声明了
find
方法,它总是只选择
dtype='Element'
的行,不是吗?在这种情况下,不需要按它排序。我希望两个类
Group
Model
都出现在搜索中。所以我在基类(
元素
)上使用find。但我希望组中的对象显示在模型之前。刚刚创建了一个带有继承表的示例应用程序,可以在查找器中使用鉴别器字段。。。还有一些工作要做:)看这里:尤其是这里:谢谢。你的解决方案很有效。如果你发布一个答案,我非常乐意接受。
List<Content> contents = Content.find.where().orderBy("dtype ASC").findList();