Как динамично заказать many-many отношения с JPA или HQL?

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

@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>();

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

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

P.S. Используя Игру! Платформа JPASupport для моих объектов.

6
задан Matt Solnit 9 June 2010 в 00:32
поделиться

1 ответ

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

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

9.1.28 Аннотация OrderBy

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

@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OrderBy {
 String value() по умолчанию "";
}

Синтаксис элемента упорядочивания значения элемента является 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 getStudents() { ...};
 ...
}

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

26
ответ дан 8 December 2019 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: