2012-02-01 74 views
0

我想在不知道他的id的情況下檢查數據庫中對象的存在。我使用它HQL查詢,但我recieving的excenption休眠。以傳遞對象作爲參數的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(); 

我明白這個異常的原因,但我怎樣才能使查詢與傳遞對象作爲參數?我想知道,是不是數據庫中的平等對象。

+0

你的對象是否有id屬性? – 2012-02-01 09:38:20

回答

3

我不認爲這個異常來自於你使用臨時實體作爲你的查詢參數(雖然這個查詢也是錯誤的,見下文)。

這個異常來自於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

+0

我已經發布了太簡單的例子。除了名稱和值之外,我還有許多相關的對象(比如yeasterday的問題)。我仍然試圖讓它沒有迴路:( – 2012-02-01 09:50:06