【问题标题】:Hibernate. HQL query with transistent object as a parameter休眠。以瞬态对象为参数的 HQL 查询
【发布时间】:2012-02-23 23:44:16
【问题描述】:

我想在不知道他的身份的情况下检查数据库中对象的存在。我正在使用 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();

我理解这个异常的原因,但是如何以瞬态对象作为参数进行查询?我想知道,是不是数据库中的相等对象。

【问题讨论】:

  • 你的对象有id属性吗?

标签: hibernate hql


【解决方案1】:

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

异常来自这样一个事实,即 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

【讨论】:

  • 我发布的例子太简单了。除了名称和值之外,我还有一组多对一的相关对象(就像在酵母日的问题中一样)。我仍在尝试使其没有循环:(
【解决方案2】:

另一个(更好的)选择是:

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

这个解决方案已经在another post 中提出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多