Как этот SQL-запрос в файле hbm.xml может быть записан в исходном коде? - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь запустить SQL-запрос в Hibernate.Я использую его документацию .Из-за некоторых неизвестных значений я пытаюсь сделать в исходном коде.

См. Это ниже конфигурации SQL-Query.Как переписать это в самом исходном коде !!Я пробовал это

personList = session.createSQLQuery("SELECT person.NAME, person.AGE, person.SEX, address.STREET, address.CITY, address.STATE, address.ZIP FROM person JOIN address WHERE person.ID = address.PERSON_ID").addEntity(Person.class).addEntity(Address.class).list();

Что я пытаюсь сделать с вышеупомянутым запросом, это должно сопоставить person.ID & PERSON_ID.Если он совпадает, извлеките другие столбцы в таблице ADDRESS [STREET, CITY, STATE, ZIP] со столбцами таблицы PERSON [NAME, AGE, SEX].

В JDBC столбцы набора результатов дляприведенный выше запрос выглядит так:

NAME, AGE, SEX, STREET, CITY, STATE, ZIP

Но он не работает, говорит, что адресные столбцы в запросе не найдены.Есть ли какая-либо синтаксическая ошибка в моей версии запроса !!

Объявление запроса в файле отображения ;

<sql-query name="personsWith">
<return alias="person" class="eg.Person"/>
<return-join alias="address" property="person.mailingAddress"/>
SELECT person.NAME AS {person.name},
       person.AGE AS {person.age},
       person.SEX AS {person.sex},
       address.STREET AS {address.street},
       address.CITY AS {address.city},
       address.STATE AS {address.state},
       address.ZIP AS {address.zip}
FROM PERSON person
JOIN ADDRESS address
    ON person.ID = address.PERSON_ID
</sql-query>

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Это не работает из-за неправильного использования AddEntity:

Этот фрагмент кода:

personList = session
  .createSQLQuery("SELECT ...")
  .addEntity(Person.class)
  .addEntity(Address.class).list();

addEntity добавляет параметр в запрос объектатип.Например, вы можете сделать это:

personList = session
  .createSQLQuery("from person where address = :address"
  .addEntity("address", myAddess);

Я не уверен, что вы могли бы сделать то же отображение сущности в коде.Мне пришлось прочитать документацию.


Редактировать :

Вы можете легко найти всех людей с такими адресами:

session.createQuery("from Person p where p.address is not null");

или, если у человека нет свойства adress:

session.createQuery("select distinct a.Person from Address");

предполагается, что на одном адресе может быть несколько человек.

2 голосов
/ 24 сентября 2010

Две возможные причины для отсутствия столбцов 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();

Скажите, пожалуйста, работает ли какой-либо из этих примеров.

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