【问题标题】:HQL : Getting the primary key of an objectHQL:获取对象的主键
【发布时间】:2009-12-10 05:59:41
【问题描述】:

我正在使用 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()

;

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

我有办法做到这一点。

谢谢! 普拉提克

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    最重要的问题是“为什么?”也就是说,除非你真的想在上面输入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,那么您需要重新考虑您的逻辑并在保存之前为序列选择当前值。

    【讨论】:

      【解决方案2】:

      主键可以是任何东西。如果你不知道它会是什么,那么即使Query 有一些方法返回Object,你也不能转换到它。

      做你正在做的事情的正确方法是不是 HQL。 Session / EntityManager 有许多方法(save / persist / merge() 等),它们设置您的主键(如果已生成),您可以通过对象的 getter 获取它.

      一般来说,仅对 SELECTS 使用 HQL。即使更新/删除查询看起来与调用delete() 相同,HQL 也不处理级联,因此异常是不可避免的。

      【讨论】:

        【解决方案3】:

        您应该通过在 java 对象上调用 session.save() 来利用 hibernate 的强大功能,而不是使用查询代码,例如:

        sessionFactory.getCurrentSession().save(askForHelp);
        

        然后直接在此之后,您可以这样做来获取对象的主键(假设它被称为 id):

        askForHelp.getId();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-27
          • 2018-11-30
          相关资源
          最近更新 更多