我有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字段)
非常感谢!
答案 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列按条款订购。