2009-12-10 60 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();