HQL:获取对象的主键

时间:2009-12-10 05:59:42

标签: java hibernate 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()

现在我想要DB中创建的对象的主键(DB中的序列)。我无法使用select查询,因为除了主键之外,没有字段组合会使此对象在数据库中唯一。

我有办法做到这一点。

谢谢! PRATIK

3 个答案:

答案 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();