Hibernate.HQL-запрос с временным объектом в качестве параметра - PullRequest
0 голосов
/ 01 февраля 2012

Я хочу проверить наличие объекта в базе данных, не зная его идентификатора. Я использую запрос HQL для него, но я получаю исключение

org.hibernate.TransientObjectException: 
object references an unsaved transient instance - save the transient instance before flushing

Вот мой пример кода:

ObjectToCheck obj = new ObjectToCheck(); //this is a mapped entity
obj.setName("name");
obj.setValue("value");
List list = session.createQuery("from ObjectToCheck as o where o = ?")
        .setEntity(0, obj)
        .list();

Я понимаю причину этого исключения, но как я могу сделать запрос с временным объектом в качестве параметра? Я хочу знать, равен ли объект в базе данных или нет.

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Я не думаю, что исключение происходит из-за того, что вы используете временную сущность в качестве параметра вашего запроса (хотя этот запрос также неверен, см. Ниже).

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

Теперь ваш запрос: where o = ? не будет магически запрашивать имя и значение.,Это будет запрос по идентификатору.И это именно то, что вы не хотите делать.Таким образом, запрос должен быть:

select o from ObjectToCheck o where o.name = :name and o.value = :value

И вы должны связать оба параметра.Другой способ сделать это - использовать запрос на примере.Смотри http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#querycriteria-examples.

0 голосов
/ 08 июня 2018

Другой (и лучший) вариант:

from ObjectToCheck as o where o.name = :#{#obj.name}

Это решение уже было предложено в другом посте .

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