Создание нового экземпляра объекта в спящем режиме с помощью SQL-запроса - PullRequest
4 голосов
/ 16 июля 2010

Я пытаюсь создать объект в спящем режиме с помощью запроса, который затем будет сохранен обратно в таблицу, представляющую класс.

Выдержка из файла hbm.xml:

<class name="MyClass" table="MY_TABLE">
<id column="ID" name="ID">
   <generator class="sequence">
    <param name="sequence">MY_SEQ</param>
   </generator>
</id>
  <property column="VAL" name="val" type="string"/>
</class>

<sql-query name="myQuery">
  <return class="MyClass"/>
  SELECT MY_SEQ.nextval ID, 'something' VAL from DUAL
</sql-query>

Фрагмент кода из контрольного примера:

MyClass myClass = (MyClass) session.getNamedQuery("myQuery").list().get(0);
Transaction t = session.beginTransaction();
session.save(myClass);
t.commit();

Моя цель состоит в том, чтобы теперь в таблице MY_TABLE должна быть новая запись, но вставка не происходит, я предполагаю, что это связано с тем, что Hibernateзнаю, что экземпляр не был сохранен в БД.

Я попытался изменить запрос следующим образом:

SELECT NULL ID, 'something' VAL from DUAL

Но это приводит к тому, что Hibernate не создает объект.

Итак, как я могу создать новый экземпляр объекта из запроса, который не связан с постоянным экземпляром класса, и использовать его для создания постоянного экземпляра?

1 Ответ

5 голосов
/ 16 июля 2010

Обновление: Я протестировал предложенный ниже подход и не смог заставить его работать в этом конкретном сценарии. Hibernate ожидает, что вы выберете столбцы для всех атрибутов, в то время как нам определенно не нужен идентификатор. Однако использование ResultTransformer сработало:

16.1.5. Возвращение неуправляемых субъектов

Можно применить ResultTransformer на собственный SQL запросы, позволяющие вернуть неуправляемые объекты.

sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
        .setResultTransformer(Transformers.aliasToBean(CatDTO.class))

Указан этот запрос:

  • строка запроса SQL
  • преобразователь результата

Приведенный выше запрос вернет список CatDTO, который был создан и вводят значения ИМЯ и BIRTHNAME в свой соответствующий свойства или поля.

В документации упоминаются возвращаемые неуправляемые объекты, но они также работают с объектом (нет причин, по которым он не будет работать), и я мог бы persist временно изменить объект.

Смотри также

Я оставляю первоначальный ответ для ясности.


Может быть, поможет следующее:

16.1.2. Запросы сущностей

Все вышеупомянутые запросы возвращая скалярные значения, в основном возвращая «сырые» значения из ResultSet. Ниже показано, как получить объекты сущности из нативного sql запрос через addEntity().

sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);

Указан этот запрос:

  • строка запроса SQL
  • сущность, возвращаемая запросом

Предполагая, что Cat отображается как класс с ID столбцов, ИМЯ и ДЕНЬ РОЖДЕНИЯ вышеуказанные запросы вернуть список, где каждый элемент Кошачья сущность.

Если сущность сопоставлена ​​с много к одному другому требуется также вернуть это, когда выполнение собственного запроса, в противном случае специфичная для базы данных "колонка не найдена" ошибка произойдет. Дополнительный столбцы будут автоматически возвращены при использовании обозначения *, но мы предпочитаю быть явным, как в Следующий пример для многих к одному собака:

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class);

Это позволит cat.getDog() функционировать должным образом.

Но я не думаю, что вы должны установить идентификатор, если хотите сохранить его и хотите, чтобы Hibernate выполнил вставку.

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