Как динамически упорядочить отношения «многие ко многим» с JPA или HQL? - PullRequest
6 голосов
/ 09 июня 2010

У меня есть такое отображение:

@ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
            name="product_product_catalog",
            joinColumns={@JoinColumn(name="product_catalog", referencedColumnName="product_catalog")},
            inverseJoinColumns={@JoinColumn(name="product", referencedColumnName="product")})
    public List<Product> products = new ArrayList<Product>();

Я могу красиво выбрать товары для каталога, но не могу (динамически) заказать товары. Как я мог их заказать? Я, вероятно, должен написать HQL-запрос «многие ко многим» с предложением order-by? Хотя я передаю строку имени поля orderBy в запрос, или есть лучшее решение?

Таблицы: товары, каталог товаров, product_product_catalog (ассоциативная таблица)

P.S. Используя Play! Фреймворк JPASподдержка для моих сущностей.

1 Ответ

25 голосов
/ 09 июня 2010

Я могу красиво выбрать товары для каталога, но не могу (динамически) заказать товары.Как я могу заказать их?

Невозможно, если вы разрешите JPA получить ассоциацию.Отображения являются статическими, лучшее, что вы можете сделать с отображениями, это указать порядок в «время получения»:

9.1.28 Примечание OrderBy

Аннотация OrderBy указываетупорядочение элементов ассоциации с ценным набором в точке, в которой извлекается ассоциация.

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
   String value() default "";
}

Синтаксис элемента упорядочения значений представляет собой orderby_list , как показано ниже:

orderby_list::= orderby_item [,orderby_item]*
orderby_item::= property_or_field_name [ASC | DESC]

Если ASC или DESC не указаны, предполагается ASC (в порядке возрастания).

Если элемент упорядочения не указан, предполагается упорядочение по первичному ключу ассоциированного объекта.

Имя свойства или поля должно соответствовать имени постоянного свойства или поля связанного класса.Свойства или поля, используемые в упорядочении, должны соответствовать столбцам, для которых поддерживаются операторы сравнения.

Пример:

@Entity public class Course {
  ...
  @ManyToMany
  @OrderBy("lastname ASC")
  public List<Student> getStudents() {...};
  ...
}

Поэтому используйте либо пользовательскийнайти или отсортировать ваш список из Java с помощью Comparator.

...