powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate и поиск по дереву
16 сообщений из 16, страница 1 из 1
Hibernate и поиск по дереву
    #38425713
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Подскажите пожалуйста как лучше осуществлять поиск по дереву используя Hibernate. Есть например запрос "Беларусь Минск" и нужно в дереве найти все элементы которые соответствуют этому запросу. Причем например в дереве может быть связь Беларусь->Минская область->Минск, а пользователь вводит не точную. Подскажите пожалуйста как лучше делать поиск используя Hibernate, может быть в нем есть специальные инструменты для этого?

Таблица древа:
Tree
ID
PID
name
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425723
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К Хибернейту это никакого отношения не имеет, он не для этого создан. Это надо либо хитрый нативный SQL писать (в ORACLE, например, для подобных задач есть CONNECT BY PRIOR), либо что-то с моделью данных делать (например, какая-нибудь промежуточная таблица, денормализация, и т.д.).
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425750
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше возможностями базы пользоваться, в чистом SQL древовидные структуры неэффективно работают. В PostgreSQL, например, есть тип данных ltree, который легко подружить с Hibernate. И даже Native SQL не требуется.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425752
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv , большое спасибо за ответ. Я mysql использую и насколько знаю в ней нет такой возможности, и я так понимаю хитрый запрос можно создать только средствами Oracle? А в mysql придется довольствоваться лишь созданием дополнительной таблицы.

Дополнительная таблицы:
TreeTmp
treeID (= ссылка на ID таблицы tree)
name (= 'Беларусь, Минская область, Минск')

Ну и соответственно искать полнотекстовым поиском.

Тогда такой вопрос стоит ли переезжать на Oracle, знаю у них есть бесплатные версии или лучше использовать дополнительную таблицу.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425865
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9,

Полнотекстовый поиск совершенно не обязателен. Прочитайте, например, это .
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425875
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркПрочитайте, например, это .
Это всего лишь костыли, чтобы хоть как-то запихать деревья в реляционную модель. Я уж молчу про то как несладко будет автору работать с этими структурами в Hibernate и с какой скоростью будут работать запросы к таким структурам. В современных базах есть более эффективные методы работы с деревьями.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425881
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикЯ уж молчу про то как несладко будет автору работать с этими структурами в Hibernate
Не вижу никаких принципиально неразрешимых сложностей.
Мужик и с какой скоростью будут работать запросы к таким структурам.
А со скоростью запросов-то что?
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425894
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикЛокшин МаркПрочитайте, например, это .
Это всего лишь костыли, чтобы хоть как-то запихать деревья в реляционную модель. Я уж молчу про то как несладко будет автору работать с этими структурами в Hibernate и с какой скоростью будут работать запросы к таким структурам. В современных базах есть более эффективные методы работы с деревьями.
Это не костыли. Это денормализация или матерализация (materialized views) для более
быстрого доступа к древовидным структурам. Концептуально это используется не только
для деревьев но и вообще для ЛЮБЫХ поисковых структур где search идёт медленно и его
нужно ускорить. Тем более что в данном вопросе автор говорит о "нечётком" поиске а здесь
без специальных дополнительных структур данных не удасться особо ничего ускорить.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425920
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton , поддерживаю.
Реляционная модель имеет всего лишь два преимущества: она предъявляет минимальные требования к размеру стораджа, и она проста в управлении (на уровне DDL). Но размер с текущей стоимостью памяти (как HDD/SSD, так и RAM), первое преимущество все больше теряет свою актуальность. А второе преимущество - простота - аукается тем, что реляционные отношения хорошо себя ведут только когда мы не выходим далеко за рамки обычных джоинов. Как только появляются какие-то заморочки вроде кубов, роллапов или деревьев, то сразу же начинаются проблемы. И всякие "костыли" вроде обратных индексов и прочей денормализации - это абсолютно нормальное решение этих проблем. Весь BI и репортинг на этих "костылях" построен.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38425960
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже более того. К нормализации до 3НФ (хотя-бы) можно стремиться как до светлого будущего
в самых лазурных мечтах писателей-утопистов. Нормальные формы Бойса-Кодда были созданы
как теория. Как попытка внести ясность в дикий хаос денормализованных входных данных
которые нужно как-то загрузить в БД и обрабатывать. И следовать им можно лишь так
как мы следуем советам "не есть пола" и "надевать зимой шерстяные носки". Эти советы
(или тезисы или постулаты) естественны и понятны любому нормальному челу с физ-мат
образованием без всякого пафоса и театральности. 3НФ это просто советы. Или пожелания.
Всё равно в любой крупной БД или системе есть staging tables, log tables, report tables
в которых нормализация едва-ли тянет на 1НФ. Вы от этого никуда не денетесь. А что
касается ваших файловых систем или хранилищь (к которым теоретически тоже можно
предьявить определённые пожелания по НФ) так там "вообще - конь не валялся". Дубли.
Версии одного и того-же файла. Копии файлов. Линки на файлы. Архивы с дублями e.t.c.
И нас этот факт не беспокоит. А когда стоит задача - форсировать аналитику с OLAP
или MatViews то здесь сам вендор предлагает тулзы чтобы вы красимо и изящно
пнули старика Кодда в его старую задницу дескыть - "Прости старичелло, я теорию
уважаю но перформанс страдает. Извини".

Вот такая ботва.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38427042
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк , вы написали что не обязательно использовать полнотекстовый поиск.

Дело в том что мне вообще нужно:
1. Получить все элементы дерева по не точному поиску (для всплывающих подсказок);
2. Получить самого 1 родителя по потомку.

Поясню по 1 пункту. Вообще нужно для всплывающих подсказок при поиске.

Структура:
СНГ
|_Беларусь
|_Минская область
|_Минск
|_Солигорск

Запрос пользователя (может быть и более точным):
СНГ Минская область

Результат:
Минск, Минская область, Беларусь, СНГ
Солигорск, Минская область, Беларусь, СНГ

Какая будет логика поиска? А что если города повторяются?
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38427122
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моноширном шрифте структура будет точнее.
Код: java
1.
2.
3.
4.
5.
6.
Структура:
СНГ
    |_Беларусь
          |_Минская область
                |_Минск
                |_Солигорск
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38427143
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придется пихать путь в узлы, в самом простом варианте
NODES
ID NAME PARENT PATH LEVEL1 Беларусь 0 Беларусь 02 Минская область 1 Беларусь->Минская область 13 Минск 2 Беларусь->Минская область->Минск 2

соответственно level и path надо поддерживать руками
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38427296
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9, автор, нужны все кейсы запроса. Ты нарисовал "СНГ Минская область". А что еще пользователь
может вводить? В каком порядке? Может ли он вводить сокращения (префиксный поиск), e.t.c.
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38427395
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9 Запрос пользователя (может быть и более точным):
СНГ Минская область

Результат:
Минск, Минская область, Беларусь, СНГ
Солигорск, Минская область, Беларусь, СНГ

Какая будет логика поиска?
Например такая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
create table regions (id int, name varchar(50))
create table refs(id int,ref_id int)
insert into regions (id,name) values (1,'СНГ')
insert into regions (id,name) values (2,'Белорусь')
insert into regions (id,name) values (3,'Россия')
insert into regions (id,name) values (4,'Минская область')
insert into regions (id,name) values (5,'Минск')
insert into regions (id,name) values (6,'Солигорск')
insert into regions (id,name) values (7,'Воронежская область')
insert into regions (id,name) values (8,'Воронеж')
insert into regions (id,name) values (9,'Лиски')

insert into refs(id,ref_id)values (1,1)
insert into refs(id,ref_id)values (2,2)
insert into refs(id,ref_id)values (3,3)
insert into refs(id,ref_id)values (4,4)
insert into refs(id,ref_id)values (5,5)
insert into refs(id,ref_id)values (6,6)
insert into refs(id,ref_id)values (7,7)
insert into refs(id,ref_id)values (8,8)
insert into refs(id,ref_id)values (9,9)
insert into refs(id,ref_id)values (2,1)
insert into refs(id,ref_id)values (3,1)
insert into refs(id,ref_id)values (4,2)
insert into refs(id,ref_id)values (4,1)
insert into refs(id,ref_id)values (5,4)
insert into refs(id,ref_id)values (5,2)
insert into refs(id,ref_id)values (5,1)
insert into refs(id,ref_id)values (6,4)
insert into refs(id,ref_id)values (6,2)
insert into refs(id,ref_id)values (6,1)
insert into refs(id,ref_id)values (7,3)
insert into refs(id,ref_id)values (7,1)
insert into refs(id,ref_id)values (8,7)
insert into refs(id,ref_id)values (8,3)
insert into refs(id,ref_id)values (8,1)
insert into refs(id,ref_id)values (9,7)
insert into refs(id,ref_id)values (9,3)
insert into refs(id,ref_id)values (9,1)
select refs.id
from refs join regions on refs.ref_id = regions.id and regions.name in ('СНГ','Россия')
group by refs.id 
having count(refs.id) = 2


Если нужны только листья дерева, то это тоже несложно делается. Ну и индексы добавить.
z3r9А что если города повторяются?
А в чем проблема?
...
Рейтинг: 0 / 0
Hibernate и поиск по дереву
    #38430282
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин Марк , спасибо большое за ответ, смысл понял, точно также можно и по не полному слову найти. Единственное заморочки с поддержкой такой структуры, в плане целостности и изменения.

Спасибо большое всем за помощь!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate и поиск по дереву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]