休眠。使用transistent对象作为参数的HQL查询

时间:2012-02-01 09:22:45

标签: hibernate hql

我想在不知道他的身份的情况下检查数据库中对象的存在。我正在使用HQL查询,但我正在接受一个偏见

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

这是我的代码exapmle:

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();

我理解这个异常的原因,但是如何使用transistent对象作为参数进行查询?我想知道,数据库中是否是平等对象。

2 个答案:

答案 0 :(得分:4)

我认为异常不是因为您使用瞬态实体作为查询的参数(尽管此查询也是错误的,请参阅下文)。

异常来自Hibernate在执行查询之前刷新会话这一事实,但是您已将临时实体附加到会话中的附加实体。因此它试图保存关联,但由于该对象是暂时的并且还没有任何ID,所以这是不可能的。

现在您的查询:where o = ?不会按名称和值进行神奇的查询。它将按ID查询。这正是你不想做的事情。因此查询应为:

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

答案 1 :(得分:0)

另一个(也是更好的)选项是:

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

another post已经提出了此解决方案。