Crud模块:列出具有特定订单的OneToMany

时间:2011-10-18 09:21:05

标签: playframework sql-order-by

我正在使用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;
    }
}

3 个答案:

答案 0 :(得分:4)

编辑更新

我担心这是微不足道的。在框架中,检索城市列表的代码是this一个。正如您所看到的,它不会向查询添加任何“order by”,因为它是通用的。绘制rels(here)的CRUD标记只是迭代该字段。

最简单的解决方案是使用CRUD自定义功能(here)并使用teh#{crud.custom}标记用自定义的城市列表绘制自己的下拉列表。

OLD ANSWER

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

  @Entity 
    public class Foo{
       ...
       @OneToMany
       @OrderBy("nomination ASC")
       public List<City> cities;
       ...
    }

这样,列表“cities”将按参数排序。

我刚才注意到你提到你正在使用CRUD模块。在这种情况下,据我所知,CRUD列出了它显示的第一列所排序的字段。尝试按照this页面更改该列,以便名称是第一列。

答案 1 :(得分:0)

我通过黑客攻击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();
        }
    };
}

这样,您可以使用@OrderBy(“name”)在User模型上注释City属性,并且在使用CRUD模块编辑User对象时,您将获得一个有序的下拉列表:

@Entity 
public class User{
   ...
   @OneToMany
   @OrderBy("name ASC")
   public City city;
   ...
}

答案 2 :(得分:0)

今天遇到同样的问题。

如果您不想在每次拥有OneToMany关系时破解JPAPlugin或创建自定义字段,您还可以通过一点JavaScript对客户端进行重新排序。

这是使用jQuery但你也可以在Vanilla中轻松完成

<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>

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