Play Framework 2.2 - Ebean - ManyToMany OrderBy关系创建日期

时间:2014-11-12 03:55:14

标签: java playframework-2.0 ebean

我有2个模特,锻炼和锻炼如下:

@Entity
public class Workout extends Model {

    @Id
    public Integer id;

    @ManyToMany(cascade = CascadeType.REMOVE)
    public List<Exercises> exercises;

}

@Entity
public class Exercise extends Model {

    @Id
    public Integer id;

    @ManyToMany
    public Workout workout;

}

当我加载锻炼并尝试显示它时,我希望锻炼按照创建关系(锻炼和锻炼之间)的顺序显示。但是,练习将按照创建练习的顺序显示。这是一个显示示例(如果它有帮助):

<ul>
    @workout.exercises.map { exercise =>
    <li>
        @exercise.name    
    </li>
    }
</ul>

关于如何实现这一目标的任何想法?我已经尝试将@OrderBy添加到属性定义中,但这并不允许我按关系表字段排序,这是理想的(在该表上添加了created_date字段)

非常感谢!

2 个答案:

答案 0 :(得分:0)

据我所知,没有简单的方法。只需创建一个getSortedExcercises(),它返回排序在模板中使用的列表:

public List<Exercises> getSortedExcercises() {
    List<Exercises> l = new ArrayList(this. exercises);
    Collections.sort(l, new ExercisesComparator());
    return l;
}

答案 1 :(得分:0)

就SQL而言,您需要order by子句来保证返回行的顺序。这就是你所看到的'......按照创建练习的顺序显示的行为'。 ...实际上特定于您的数据库约定(并且不能跨数据库移植)。

如果你希望通过'命令创建关系(在锻炼和锻炼之间)创建SQL结果排序'......那么严格意味着你需要一个db列来将它存储在交集表上并拥有该列的SQL顺序。

现在,默认情况下,使用@ManyToMany生成的交集表没有“When Created”列。您可以显式地对交集表进行建模(从@ManyToMany更改为使用2 @OneToMany等)或手动定义您的交集表,其中包含'When Created'列和DB触发器以填充...然后在该列中引用该db列按条款订购。