У меня есть структура древовидной структуры категории, используя 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.
Любые идеи о том, как изменить мою модель, чтобы заставить ее работать?
Заранее благодарен!
Возможно ли без дополнительных запросов? Это то, что я делаю сейчас, но это не изящно и увеличивает латентность. Другой вариант не хорош, так как это дерево, и счетчик вернет только текущий уровень или подсчет подкатегорий без дальнейшего спуска на более низкие уровни. – krakover
Другой вариант - обновить itemCount каждый раз, когда Item добавляется к дереву или любому из его дочерних элементов. Вы можете сделать это в своем методе addItem(). – James