Hibernate один ко многим поиску - PullRequest
0 голосов
/ 17 марта 2012

У меня две таблицы родительская и дочерняя.У меня есть данные в этих двух таблицах как родительские:

PARENT_ID   city
----------------
20           B 
22           C
24           D

child:

CHILD_ID    PARENT_CHILD_JOIN        phone
------------------------------------------
2             20                     1111
3             20                     2222 
4             22                     3333

Я связал эти две таблицы в child.hbm.xml как:

<many-to-one name="myMtO" class="com.Parent" fetch="select">
        <column name="PARENT_CHILD_JOIN" not-null="true" />
</many-to-one>

в parent.hbm.xml:

<set name="mySet" table="child" cascade="save-update"  inverse="true" lazy="true" fetch="select">
        <key>
            <column name="PARENT_CHILD_JOIN" not-null="true" />
        </key>
<one-to-many class="com.Child" />  
</set>

При сохранении я сохраняю только parent , session.save(parent); При этом значение PARENT_CHILD_JOIN в дочерней таблице автоматически заполняется из столбца PARENT_ID из родительской таблицы.

Теперь здесь я хочу получить данные как:

select c.phone 
from child c, parent p 
where c.PARENT_CHILD_JOIN = p.PARENT_ID 

Но в нем есть столбец PARENT_CHILD_JOIN, указанный в child.Это правильно.Поскольку при сохранении я не установил его явно.

Может кто-нибудь сказать мне, как я могу получить эти данные для многих данных?

Ответы [ 2 ]

2 голосов
/ 04 октября 2012

это проблема, с которой сталкивается SQL, а не спящий режим. Есть много способов исправить это в SQL (например, оператор минус). Для имитации того же поведения в Hibernate вы можете использовать операторы IN / NOT IN. Это самый простой способ, который я нашел (принимая во внимание, что вы должны соответствовать "n" значениям дочерних столбцов, а не только одному).

Чтобы быть более конкретным: 1. выберите из дочерней таблицы значения столбца IN (...). Установите проекцию для столбца FK или другого столбца, который вы хотите (я буду использовать столбец FK, например, идентификатор parrent). 2. выберите из дочерней таблицы значения столбца NOT IN (...). Установите проекцию на FK или другой столбец, который вы хотите (то же самое здесь: я буду использовать столбец FK, например, идентификатор parrent). 3. выберите все части, в которых запрос ID IN получен из пункта 1, а запрос ID NOT IN получен из пункта 2.

Таким образом, вы также можете быть уверены, что не получите дубликаты объектов parrent. И если вы хотите разбить на страницы, вы также можете использовать последний запрос, который я описал.

Пожалуйста, предоставьте отзыв, если это помогло.

Надеюсь, это поможет, Николае

0 голосов
/ 17 марта 2012

HQL использует сущности и их свойства. Он не использует имена таблиц и столбцов.

select c.phone from Child c inner join c.myMtO

Обратите внимание, что это объединение (и предложение where в вашем запросе) не имеет никакой цели, так как все дочерние элементы связаны с родителем (столбец объединения не равен нулю).

В документации Hibernate есть целая глава , посвященная HQL . Прочитайте это.

Примечание: myMtO действительно ужасное имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...