Две возможные причины для отсутствия столбцов address
:
Во-первых, в SQL вы должны написать имя таблицы, а не имя сущности.
Во-вторых, ваше предложение JOIN может быть недопустимым в SQL. Есть несколько способов реализовать объединение. Я выберу прямой подход (выберите из таблицы и укажите соединение в предложении where).
Если предположить, что объект person
отображает таблицу с именем "TABLE_PERSON
", а address
отображает таблицу "TABLE_ADDRESS
", допустимый запрос будет выглядеть следующим образом:
SELECT person.NAME, person.AGE, person.SEX,
address.STREET, address.CITY, address.STATE, address.ZIP
FROM TABLE_PERSON person, TABLE_ADDRESS address
WHERE person.ID = address.PERSON_ID
Еще один момент. Проверяя документацию гибернации, я нашел этот пример:
List cats = sess.createSQLQuery("select {cat.*}, {kitten.*} from cats cat, cats kitten
where kitten.mother = cat.id").
setResultSetMapping("catAndKitten").list();
Так что, возможно, проблема не в самом запросе, а в используемом сопоставлении результирующего набора и способе ссылки на поля.
Предположим, это отображение (из документа Hibernate):
<resultset name="personAddress">
<return alias="person" class="eg.Person"/>
<return-join alias="address" property="person.mailingAddress"/>
</resultset>
Затем, как указано в примере, ваш запрос должен определить столбцы в фигурных скобках ({}
) и использовать псевдоним, который вы определили в отображении:
personList = session.createSQLQuery(
"SELECT {person.NAME}, {person.AGE}, {person.SEX}, "+
"{address.STREET}, {address.CITY}, {address.STATE}, {address.ZIP} "+
"FROM TABLE_PERSON person, TABLE_ADDRESS address "
"WHERE person.ID = address.PERSON_ID"
).setResultSetMapping("personAddress")
.list();
Скажите, пожалуйста, работает ли какой-либо из этих примеров.