объединение двух таблиц с разными именами столбцов соединения

У меня есть две таблицы A -> B с отображением/ассоциациями «многие к одному».

Первичный ключ таблицы B является внешним ключом в таблице A.

Проблема в том, что имена столбцов в обеих таблицах разные. скажем, B имеет столбец первичного ключа «typeNumId», который является внешним ключом в таблице A как «тип». Как я могу присоединиться к обеим таблицам в этом столбце? как я могу указать сопоставление, чтобы указать, что таблицы должны объединяться по «typeNumId» и «type», которые по сути одинаковы.

особенно возможно ли это через конфигурацию гибернации (файлы hbm)?

что-то типа

<many-to-one name="Type" class="com.domain.ProcedureType" update="false" insert="false" fetch="join" lazy="false">
    <column name="? <this is in questions? >" not-null="true" />
</many-to-one>

person alwaysLearning    schedule 03.09.2010    source источник
comment
Я думаю, что вы потеряли большую часть своего XML-примера из-за удаления html, попробуйте сделать отступ в четыре пробела (или нажмите кнопку кода).   -  person Scott Stafford    schedule 03.09.2010


Ответы (3)


Предложение ON:

select * from A join B on A.type = B.typeNumId
person Scott Stafford    schedule 03.09.2010
comment
На самом деле, я понимаю вопрос о том, как написать отображение. - person Pascal Thivent; 03.09.2010
comment
@Pascal Thivent: Определенно. Я ответил на вопрос до того, как он содержал какое-либо упоминание о Hibernate, и, поскольку я не знаю Hibernate, я не мог повторно ответить ... ;) - person Scott Stafford; 03.09.2010
comment
Аааа, я не заметил, что ОП обновил вопрос. Теперь это имеет смысл. - person Pascal Thivent; 03.09.2010

Вы объявляете имя внешнего ключа, используя атрибут column элемента many-to-one или эквивалентный вложенный элемент column. Из документации:

5.1.12. Многие к одному

Обычная ассоциация с другим постоянным классом объявляется с использованием элемента «многие к одному». Реляционная модель представляет собой ассоциацию «многие к одному»; внешний ключ в одной таблице ссылается на столбцы первичного ключа целевой таблицы.

<many-to-one
        name="propertyName"                                          (1)
        column="column_name"                                         (2)
        class="ClassName"                                            (3)
        cascade="cascade_style"                                      (4)
        fetch="join|select"                                          (5)
        update="true|false"                                          (6)
        insert="true|false"                                          (6)
        property-ref="propertyNameFromAssociatedClass"               (7)
        access="field|property|ClassName"                            (8)
        unique="true|false"                                          (9)
        not-null="true|false"                                        (10)
        optimistic-lock="true|false"                                 (11)
        lazy="proxy|no-proxy|false"                                  (12)
        not-found="ignore|exception"                                 (13)
        entity-name="EntityName"                                     (14)
        formula="arbitrary SQL expression"                           (15)
        node="element-name|@attribute-name|element/@attribute|."
        embed-xml="true|false"
        index="index_name"
        unique_key="unique_key_id"
        foreign-key="foreign_key_name"
/>
  1. имя: имя свойства.
  2. столбец (необязательно): имя столбца внешнего ключа. Это также может быть указано с помощью вложенных элементов.
  3. class (необязательный — по умолчанию используется тип свойства, определяемый отражением): имя связанного класса.
  4. каскад (необязательно): указывает, какие операции следует каскадировать от родительского объекта к связанному объекту.
  5. fetch (необязательный - по умолчанию для выбора): выбирает между выборкой внешнего соединения или последовательной выборкой выборки.
  6. update, insert (необязательный — по умолчанию true): указывает, что отображаемые столбцы должны быть включены в операторы SQL UPDATE и/или INSERT. Установка обоих значений в false разрешает чистую «производную» ассоциацию, значение которой инициализируется из другого свойства, которое сопоставляется с тем же столбцом (столбцами), триггером или другим приложением.
  7. ссылка-свойства (необязательно): имя свойства связанного класса, которое присоединено к этому внешнему ключу. Если не указано, используется первичный ключ связанного класса.
  8. доступ (необязательный — по умолчанию свойство): стратегия, которую Hibernate использует для доступа к значению свойства.
  9. уникальный (необязательно): включает генерацию DDL уникального ограничения для столбца внешнего ключа. Позволив этому быть целью свойства-ref, вы можете сделать множественность ассоциации один к одному.
  10. not-null (необязательно): включает DDL-генерацию ограничения допустимости значений NULL для столбцов внешнего ключа.
  11. optimistic-lock (необязательный — по умолчанию true): указывает, что обновления этого свойства требуют или не требуют приобретения оптимистической блокировки. Другими словами, он определяет, должно ли происходить приращение версии, когда это свойство является грязным.
  12. ленивый (необязательный — по умолчанию прокси): по умолчанию одноточечные ассоциации проксируются. lazy="no-proxy" указывает, что свойство должно извлекаться лениво при первом доступе к переменной экземпляра. Для этого требуется инструментарий байт-кода во время сборки. lazy="false" указывает, что ассоциация всегда будет извлекаться с нетерпением.
  13. not-found (необязательный — по умолчанию исключение): указывает, как будут обрабатываться внешние ключи, ссылающиеся на отсутствующие строки. ignore будет рассматривать отсутствующую строку как нулевую ассоциацию.
  14. имя-сущности (необязательно): имя сущности связанного класса.
  15. формула (необязательно): выражение SQL, определяющее значение вычисляемого внешнего ключа.

Итак, что-то вроде этого должно сделать это:

<many-to-one name="Type" class="com.domain.ProcedureType" update="false" insert="false" fetch="join" lazy="false">
    <column name="type" not-null="true" />
</many-to-one>

Ссылка

person Pascal Thivent    schedule 03.09.2010

Что-то вроде этого?

LEFT JOIN B on A.field1 = B.field2

Выбирайте тип JOIN на свой вкус

person BarsMonster    schedule 03.09.2010