2009-12-10 41 views
0

我正在使用HQL將對象保存在數據庫中。它是這樣的HQL:獲取對象的主鍵

Query query = sessionFactory.getCurrentSession().createQuery(ASK_FOR_HELP_SAVE_QUERY); 
     query.setInteger("status", askForHelp.getStatus()); 
     query.setString("requestId", askForHelp.getRequestId()); 
     query.setString("toAccountId", askForHelp.getToAccountId()); 
     query.setDate("creationDate", askForHelp.getCreationDate()); 
     query.executeUpdate() 

;

現在我想在數據庫中創建的對象的主鍵(在數據庫中的序列)。我無法使用選擇查詢,因爲沒有字段組合會使此對象在數據庫中唯一,除了主鍵。

我有辦法做到這一點。

謝謝! Pratik

回答

0

主鍵可以是任何東西。如果你不知道它會是什麼,那麼即使Query有一些方法返回Object,你不能施展它。

做你在做什麼的正確方法是而不是 HQL。 Session/EntityManager有許多方法(save/persist/merge()等),它們設置您的主鍵(如果它是生成的),並且您可以通過對象的getter獲取它。

一般來說,僅對SELECTS使用HQL。即使更新/刪除查詢看起來與調用delete()相同,HQL也不處理級聯,因此異常是不可避免的。

2

最重要的問題是「爲什麼?」也就是說,除非你真的打算在上面輸入createSQLQuery()

如果您使用HQL,這意味着您已經映射了您的實體。如果是這樣的話,爲什麼不使用session.save()session.saveOrUpdate()?你可以使用configure a generator作爲實體的ID,它會在實體保存後自動填充。

對於序列你會使用類似:

<id name="id" type="long" column="my_id"> 
    <generator class="sequence"> 
      <param name="sequence">my_id_sequence</param> 
    </generator> 
</id> 

現在,如果你實際使用SQL,而不是HQL,那麼你需要重新考慮你的邏輯和選擇保存前序電流值。

0

而不是使用您的查詢代碼,你應該利用休眠的權力的只是在你的java調用session.save()對象如:

sessionFactory.getCurrentSession().save(askForHelp); 

然後直接在這之後,你可以做這要獲得對象的主鍵(假設它被稱爲id):

askForHelp.getId();