Java Play Framework 2.2-Ebean-多个OrderBy关系创建日期

Java Play Framework 2.2-Ebean-多个OrderBy关系创建日期,java,playframework-2.0,ebean,Java,Playframework 2.0,Ebean,我有两个模型,一个训练和一个练习,如下所示: @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

我有两个模型,一个训练和一个练习,如下所示:

@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字段,这将非常理想


非常感谢

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

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

就SQL而言,您需要一个ORDERBY子句来保证返回行的顺序。这就是你看到的那种行为。。。按创建练习的顺序显示。“。。。是特定于数据库惯例的,不可跨数据库移植

如果您希望SQL结果按“创建训练和练习之间关系的顺序”排序。。。严格来说,这意味着您需要一个db列来将其存储在交集表中,并按该列进行SQL排序


现在,使用@ManyToMany默认情况下,生成的相交表没有“创建时”列。您可以将交集表的模型从@ManyToMany显式更改为使用2@OneToMany等,也可以使用“创建时”列和DB触发器手动定义交集表以填充该交集表。。。然后在ORDERBY子句中引用该db列。

Hey poornerd,谢谢您的回复。虽然我想我理解你建议背后的想法,但我还是花了一段时间把语法弄对了。可能它只是一个粗略的轮廓,但是,我不熟悉“练习比较器”背后的概念。很抱歉我不熟悉Java和Play框架,这是我自学的东西。基本上,您可以编写一个比较器,用于确定两个对象之间的顺序。在本例中,比较器用于确定两个对象之间的顺序。Collections.sort使用它来比较列表中的所有对象,并将它们按所需顺序排列。我现在明白了这是怎么回事,但是,我可以看到一些问题。1由于我无法访问交叉点表中的列,因此没有可从我的训练对象访问的字段可用于对它们进行正确排序。2这只是个人观点,试图通过在my DB中添加自定义列和编写自定义SQL查询来实现您的建议,这看起来非常混乱。这可能部分是由于我对Java和ebean的无知,但必须有一个更简单的方法。我感谢你的意见,但我会继续努力,希望能找到另一种方法。嘿,罗布,谢谢你的回复!我同意你的大部分建议。我只在日常工作中为这类事情编写查询,但一般来说,我对ebean和ORM都是新手。我很想了解更多关于将我的多人建议改为2个一人建议的信息。我很想自己对交集表进行建模,但不知道这是一个选项,也不知道如何在网上实现这一点。再次感谢!