我正在使用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()
现在我想要DB中创建的对象的主键(DB中的序列)。我无法使用select查询,因为除了主键之外,没有字段组合会使此对象在数据库中唯一。
我有办法做到这一点。
谢谢! PRATIK
答案 0 :(得分: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,那么您需要重新考虑逻辑并在保存之前选择序列的当前值。
答案 1 :(得分:0)
主键可以是任何东西。如果你不知道它会是什么,那么即使Query
有一些方法返回Object
,你也无法投射它。
正在做的事情的正确方法是不 HQL。 Session
/ EntityManager
有多种方法(save
/ persist
/ merge()
等),用于设置主键(如果已生成),你可以通过物体的吸气剂获得它。
一般来说,仅对SELECTS使用HQL。即使更新/删除查询看起来与调用delete()
相同,HQL也不会处理级联,因此异常是不可避免的。
答案 2 :(得分:0)
不要使用你的查询代码,你应该通过在java对象上调用session.save()来利用hibernate的强大功能,例如:
sessionFactory.getCurrentSession().save(askForHelp);
然后直接在那之后,你可以这样做以获得对象的主键(假设它被称为id):
askForHelp.getId();