Java, переходное поле гибернации

У меня есть предмет объекта домена с полями id, name, parentItem и category (логическое значение). Итак, я вставляю значения в базу данных, например:

id name parentItem category
1 Инструменты NULL 1
2 Электроинструменты 1 1
3 Мелкие инструменты 2 1
4 Фактический инструмент конец дочернего элемента 3 0

поэтому фактический элемент находится в категории/пути "Инструменты/Электроинструменты/Мелкие инструменты"

Поэтому мне нужно реализовать ленивый поиск по фильтру по categoryName/categoryPath. Например: если пользователь вводит в фильтр dataTable «Электротехника», мне нужно вернуть все элементы в категории «Электроинструменты» и все элементы из подкатегорий (в этом примере небольшие инструменты и все остальные, если они существуют).

Итак, в настоящее время у меня есть поле @Transient объекта домена java, которое использует рекурсию для получения пути к элементам. Но я не могу искать по переходным полям. Я имею в виду, что я не могу реализовать поиск в базе данных, потому что это поле:
1. Временное
2. Использует рекурсию, и если мне нужно развернуть приложение в другой версии БД, мне придется переписать рекурсивный sql в БД или что-то в этом роде. мне это не нравится

Может ли кто-нибудь указать мне какое-нибудь умное, уникальное решение? Любая идея, совет приветствуется. Спасибо!


person anotherUser    schedule 07.04.2014    source источник


Ответы (1)


Этот вопрос выглядит очень похоже: рекурсия HQL, как мне это сделать?

Короче говоря: вы не можете делать рекурсию в HQL. Ваши лучшие ставки:

  • Напишите собственный запрос для этого (и да, вам придется переписывать его при каждом перемещении базы данных, поскольку рекурсивные запросы не являются стандартным SQL)
  • Используйте столбец соединения, чтобы иметь родителей/потомков в объекте, а также просматривать и фильтровать дерево продуктов в памяти (используется больше памяти, поскольку вы предварительно загружаете все, но только один раз попадаете в БД)
  • Сделайте несколько запросов, если вы знаете, что ваше дерево не слишком глубокое. (Экономит память, но много работы с базой данных)
person Ordous    schedule 07.04.2014
comment
Привет. Что я сделал, так это: прямо сейчас я сохраняю в объекте Item его путь к категории в виде строки. Поэтому, когда пользователь сохраняет элемент, я вычисляю его путь и сохраняю его в базе данных. Почему это ? Потому что на данный момент это было самое быстрое решение. Спасибо, Ордоус. - person anotherUser; 27.04.2014