У меня есть устаревший код, который я пытаюсь сопоставить с новым кодом.
OLD_PERSON
pid
sid
name
age
NEW_PERSON
pid
sid
fid
age
RESOLVE_PERSON
pid
fid
status
Класс Java
domain.Person {
ID _id;
String _name;
Integer _age;
}
В устаревшем мире была только одна таблица: OLD_TABLE. Отображение гибернации было простым, всего один класс и его столбцы. В новом мире я должен использовать указанные выше 3 таблицы и создать одну сущность, имя которой происходит от OLD_PERSON, а возраст - от NEW_PERSON. Итак, в основном запрос SQL:
select op.name as name, np.age as age
from OLD_PERSON op
INNER JOIN RESOLVE_PERSON rp
on rp.pid = op.pid
INNER JOIN NEW_PERSON np
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid
where rp.status = 'CURRENT'
После исследования / поиска в Google я обнаружил, что могу использовать «Вторичные таблицы», которые эквивалентны «таблице JOIN» в hibernate xml. Примечание. Я не могу использовать аннотации, так как этот код старый, а я все еще нахожусь в режиме hibernate3.5.6.
Поэтому я добавил таблицу соединений в свой файл сопоставления:
<class name="domain.Person" table="OLD_PERSON">
<composite-id name="_id" class="Id">
<key-property access="property" name="key1" type="long" column="pid" />
<key-property access="property" name="key2" type="int" column="sid" />
<generator class="assigned" />
</composite-id>
<property name="_Name" type="String" column="name" />
<join table="NEW_PERSON" fetch="join" inverse="false">
<key>
<column name="pid" />
<column name="sid" />
</key>
<property name="_age" column="age" not-null="true" />
</join>
</class>
Но для соединения с таблицей NEW_PERSON требуется внутреннее соединение с таблицей RESOLVE_PERSON. Я пробовал использовать подвыбор, но это не тот вариант. Я не могу подключить здесь формулу.
Есть какие-нибудь указания на то, как этого можно достичь? По сути, я прошу, как применить проверку критериев / ограничений к JOIN.