Playframework Crud模块:列出具有特定顺序的OneToMany

Playframework Crud模块:列出具有特定顺序的OneToMany,playframework,sql-order-by,Playframework,Sql Order By,我正在使用Crud模块,我可以让它很好地工作 但是当我显示表单以添加新用户(或编辑现有用户)时,我有一个以非字母顺序显示的城市列表。我想根据名字对它们进行分类 我试图在我的模型中添加@OrderBy,但这不起作用 我怎么做 谢谢你的帮助 以下是我的模型供参考: @Entity public class City extends Model { @Required @OrderBy //doesn't work public String nomination; // I

我正在使用Crud模块,我可以让它很好地工作

但是当我显示表单以添加新用户(或编辑现有用户)时,我有一个以非字母顺序显示的城市列表。我想根据名字对它们进行分类

我试图在我的模型中添加@OrderBy,但这不起作用

我怎么做

谢谢你的帮助

以下是我的模型供参考:

@Entity
public class City extends Model {
    @Required
    @OrderBy  //doesn't work
    public String nomination; // I had to set this var to this name ...

    public String zipcode;

    public City(String nomination, String zipcode) {
        this.nomination = nomination;
        this.zipcode = zipcode;
    }

    @Override
    public String toString(){
        return this.nomination;
    }
}

更新时编辑

恐怕这不是小事。在该框架中,检索城市列表的代码是一个。正如您所看到的,它没有向查询添加任何“orderby”,因为它是通用的。绘制rels()的CRUD标记只是在该字段上迭代

最简单的解决方案是使用CRUD定制功能()并使用#{CRUD.custom}标记绘制您自己的下拉列表,其中包含有序的城市列表

旧答案

我相信您的错误在于@OrderBy注释的位置。你应该把它放在关系上:

  @Entity 
    public class Foo{
       ...
       @OneToMany
       @OrderBy("nomination ASC")
       public List<City> cities;
       ...
    }
@实体
公开课Foo{
...
@独身癖
@订购人(“指定ASC”)
公布城市名单;
...
}
这样,列表“城市”将按参数排序


我刚刚注意到您提到您正在使用CRUD模块。在本例中,据我记忆所及,CRUD列出了按其显示的第一列排序的字段。尝试根据页面更改该列,使其名称成为第一列。

我通过破解JPAPlugin.java实现了这一点:

--- a/framework/src/play/db/jpa/JPAPlugin.java
+++ b/framework/src/play/db/jpa/JPAPlugin.java
@@ -771,7 +771,11 @@ public class JPAPlugin extends PlayPlugin {

    @SuppressWarnings("unchecked")
    public List<Object> list() {
        - return getJPAContext().em().createQuery("from " + field.getType().getName()).getResultList();
        + String query = "from " + field.getType().getName();
        + if (field.isAnnotationPresent(OrderBy.class)) {
            + query += (" order by " + field.getAnnotation(OrderBy.class).value());
        + }
        + return getJPAContext().em().createQuery(query).getResultList();
        }
    };
}

今天遇到了同样的问题

如果您不想在每次建立OneToMany关系时攻击JPAPlugin或创建自定义字段,您还可以通过一点JavaScript在客户端对它们重新排序

下面是使用jQuery的方法,但您也可以轻松地使用香草

<script type="text/javascript">
    innerSort = function (a, b) {
        return (a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) ? 1 : -1;
    };
    $('select').each(function( index ) {
        var previousVal = $(this).val();
        $(this).find('option').sort(innerSort).appendTo($(this));
        $(this).val(previousVal);
    });
</script>

innerSort=函数(a,b){
返回(a.innerHTML.toLowerCase()>b.innerHTML.toLowerCase())?1:-1;
};
$('select')。每个(函数(索引){
var previousVal=$(this.val();
$(this.find('option').sort(innerSort.appendTo($(this));
$(this).val(previousVal);
});

只需将这段代码放入CRUD/layout.html模板中(您可以覆盖它来创建自己的模板,请参见播放教程),在页面末尾

您可以添加添加的实体代码和@OrderBy吗?查看错误。OrderBy应该可以工作。我的模型(用户)与城市有关系,但与@manytone(公共城市;而不是列表)有关系。所以这不起作用:/我试着把“提名”放在第一位,但也没有成功:/@cx42net我恐怕不明白。你的用户只链接到一个城市,那么那里的订购问题在哪里呢?只有一个城市。你能在问题中更详细地描述一下你的用户模型吗?你是如何通过REL获得城市列表的?现在,我更新了我的profil。起初我还不够清楚,现在可能更清楚了。谢谢你的耐心。谢谢你的帮助。我终于做了一个积垢的习惯。遗憾的是,我们不能选择按……订购。@cx42net CRUD模块是一个相对简单的实现。从某种意义上说,它很强大,但在许多情况下,最好实现自己的功能。希望Play 2.0能够改善这一点;)
<script type="text/javascript">
    innerSort = function (a, b) {
        return (a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) ? 1 : -1;
    };
    $('select').each(function( index ) {
        var previousVal = $(this).val();
        $(this).find('option').sort(innerSort).appendTo($(this));
        $(this).val(previousVal);
    });
</script>