Модуль Crud: перечисление OneToMany с определенным заказом - PullRequest
3 голосов
/ 18 октября 2011

Я использую модуль 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 ]

4 голосов
/ 18 октября 2011

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ

Боюсь, это не тривиально. В рамках код, который получает список городов: this one. Как вы можете видеть, он не добавляет к запросу "order by", поскольку он является общим. Тег CRUD, который рисует rels ( здесь ), просто перебирает это поле.

Самое простое решение - использовать возможности настройки CRUD ( здесь ) и использовать тег #hd {crud.custom}, чтобы нарисовать свой выпадающий список с упорядоченным списком городов.

СТАРЫЙ ОТВЕТ

Я считаю, что ваша ошибка в том, где размещена аннотация @OrderBy. Вы должны поставить это на отношение:

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

Таким образом, список «городов» будет упорядочен по параметру.

Я только что заметил, что вы упоминаете, что используете модуль CRUD. В этом случае, насколько я помню, CRUD перечисляет поля, упорядоченные по первому столбцу, который он отображает. Попробуйте изменить этот столбец в соответствии с этой страницей, чтобы имя было первым столбцом.

0 голосов
/ 30 января 2014

Сегодня столкнулся с той же проблемой.

Если вы не хотите взламывать JPAPlugin или создавать пользовательские поля каждый раз, когда у вас есть отношения OneToMany, вы также можете изменить их порядок на стороне клиента с помощью небольшого количества 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 (вы можете переопределить его, чтобы создать свой собственный, см. Руководство по воспроизведению), в конце страницы

0 голосов
/ 12 апреля 2012

Я получил это, взломав 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();
        }
    };
}

Таким образом, вы можете аннотировать атрибут City в вашей модели User с помощью @OrderBy («name»), и у вас будет упорядоченный раскрывающийся список при редактировании объекта User с помощью модуля CRUD:

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