2014-10-21 3 views
0

В моем приложении, у меня есть 2 классов:Play Framework Наследование сортировать по типу

- Group 
- Model 

и один базовый класс Element.

Я использую стратегию с одним столом, чтобы сохранить эти модели. (strategy = InheritanceType.SINGLE_TABLE). Таким образом, в моей таблице создается столбец dtype.

Я сейчас пытаюсь разобраться мои страницы на основе этого типа:

find.where().disjunction() 
       .add(Expr.ilike("name", "%" + filter + "%")) 
       .orderBy("dtype asc, name asc," + sortBy + " " + order).findList() 

Но это бросает исключение, что DTYPE не может быть найден.

Как я могу сортировать по типу?

Спасибо!

+0

Hm, но если у вас есть метод 'find', объявленный в вашем' Element', он всегда выбирает только строки с 'dtype = 'Element'', не так ли? в таком случае сортировка по нему не нужна. – biesior

+0

Ну, я хочу, чтобы в поиске присутствовали оба класса 'Group'' 'Model'. Поэтому я использую find в базовом классе ('Element'). Но я хочу, чтобы объекты из группы появлялись перед моделью. – dominik

+0

Просто созданный пример приложения с унаследованными таблицами, можно использовать поле дискриминатора в вашем finder ... abyway есть некоторая работа, чтобы сделать :) – biesior

ответ

2

Sample базовая модель может выглядеть следующим образом:

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; 

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; 

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; 

} 

Таким образом, вы можете выбрать все содержимое с помощью:

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

Конечно эти объекты будут только общие поля: id, dtype, title, created и modified, для получения т (Новости) newsSource или (Post) publishDate вам нужно, чтобы получить эти объекты с их собственными искатели, т.е. используя id значение из общий Запрос на контент.

Смежные вопросы