我正在使用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;
}
}
答案 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模板(您可以覆盖它以创建自己的模板,请参阅播放教程),在页面末尾