2013-06-09 2 views
0

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

Кода я унаследовал используются для вычисления количества элементов в автономном режиме, и обновить категорию, и использовать прохладный JPA трюк для выбора категории, как так:

@Entity 
@Table(name = "categories") 
@NamedNativeQuery(name = "topLevel", query = "SELECT categories.* FROM categories WHERE categories.parent_id IS NULL") 
public class Category { 
    @Id 
    private Long id; 
    private String name; 
    private Integer item_count; 
    private Long parent_id; 

    @JoinColumn(name = "parent_id") 
private List<Categories> categories; 
} 

При запуске родной запроса - я получаю все категории, заполненные древовидной структурой.

Однако теперь у меня есть новый фильтр, который не позволяет пользователю видеть все элементы в категории. Поэтому я больше не могу рассчитывать элементы в автономном режиме. Я пытался использовать присоединиться, так что я могу вычислить его в Интернете, как это:

@NamedNativeQuery(name = "topLevel", query = "SELECT categories.*, count(*) as item_count FROM categories, items_to_categories WHERE categories.id = items_to_categories.category_id and some_user_specific_query and categories.parent_id IS NULL GROUP BY categories.id") 

, но это не заполняет нижние уровни с правом пунктов сосчитать.

Поскольку я использую Eclipse Link, я не могу использовать поле формулы, которое не поддерживается в этой реализации JPA.

Любые идеи о том, как изменить мою модель, чтобы заставить ее работать?

Заранее благодарен!

ответ

0

Если вы хотите количество элементов, вы можете запросить его, например, используя JPQL. Это вернет объект [], включая категорию и его число. Если вы хотите использовать собственный SQL-запрос, вам нужно будет использовать SqlResultSetMapping.

Если вы хотите, чтобы количество элементов в категории, то вы могли бы определить VIEW базы данных, что делает это отображаемым в виде столбца и отображает представление.

Другой вариант состоит в том, чтобы сопоставить элементы категории, а затем получить количество элементов, просто получить доступ к размерам() элементов на Java (вы можете использовать сборку или пакетную выборку для эффективной загрузки элементов).

+0

Возможно ли без дополнительных запросов? Это то, что я делаю сейчас, но это не изящно и увеличивает латентность. Другой вариант не хорош, так как это дерево, и счетчик вернет только текущий уровень или подсчет подкатегорий без дальнейшего спуска на более низкие уровни. – krakover

+0

Другой вариант - обновить itemCount каждый раз, когда Item добавляется к дереву или любому из его дочерних элементов. Вы можете сделать это в своем методе addItem(). – James

Смежные вопросы