获取休眠中实体的最后一个ID

Posted

技术标签:

【中文标题】获取休眠中实体的最后一个ID【英文标题】:Get last id of an entity in hibernate 【发布时间】:2016-01-31 20:35:49 【问题描述】:

我需要一种方法来获取数据库中实体的最后一个 id,例如

产品实体:

我尝试了这个,但它不起作用:

 public int lastInsertedId() 
        try 
            if (!session.isOpen())
                session = DatabaseUtil.getSessionFactory().openSession();
            session.beginTransaction();
            Query query = session.createSQLQuery("select last_value from purchase_idpurchase_seq ");

            int lastid = query.getFirstResult();

            session.getTransaction().commit();
            session.close();
            return lastid;
         catch (Exception e) 
            e.printStackTrace();
            return -1;
        


    

【问题讨论】:

你在 Postgres 手册的什么地方找到了那个语法? postgresql.org/docs/current/static/functions-sequence.html 当我在 postgresql 中执行此查询时:从 purchase_idpurchase_seq 中选择 last_value,我得到了一个结果,但我不知道在 hibernate 中实现这个 不,我不使用证书 它不工作到底是什么意思?它会引发 PostgreSQL 错误?还是其他java异常?还是给出零或其他虚假值? 它现在对我有用。 【参考方案1】:

经过一番谷歌搜索,我得到了解决方案:

 public int lastInsertedId() 
        try 
            if (!session.isOpen())
                session = DatabaseUtil.getSessionFactory().openSession();
            session.beginTransaction();
            Criteria c = session.createCriteria(Purchase.class);
            c.addOrder(Order.desc("id"));
            c.setMaxResults(1);
            int id = (int) ((Purchase) c.uniqueResult()).getIdPurchase();
            session.getTransaction().commit();
            session.close();
            return id;
         catch (Exception e) 
            e.printStackTrace();
            return -1;
        


    

【讨论】:

必须使用currval()lastval()(我在第一条评论中已经发布的链接)来获取最近生成的序列值。如果不止一个事务正在修改数据库,您的代码将无法正常工作。另外:我很确定 Hibernate 应该能够在本地做到这一点。 Hibernate 没有“SequenceGenerator”注释【参考方案2】:

尝试使用这样的东西:

   String hql = "from purchase_idpurchase_seq";
   Query query = session.createQuery(hql);
   List<purchase_idpurchase_seq> results = query.list();

要获得last_value 的值,试试这个:

  String last_value = results.getLast_value(); //  if getLast_value return int use int.

我想你有一个实体purchase_idpurchase_seq

试试看这个site

【讨论】:

purchase_idpurchase_seq是数据库中的序列,purchase是实体 @abdouamer 看到上面的链接很有帮助

以上是关于获取休眠中实体的最后一个ID的主要内容,如果未能解决你的问题,请参考以下文章

休眠持久化实体而不获取关联对象。仅凭身份证

休眠从对象中延迟获取嵌套列表

如何使用 JPA 获取最后一个持久化实体的 ID

使用休眠从数据库中获取下一个序列值

在休眠中使用继承时如何仅获取一种实体?

具有嵌入对象的实体的休眠条件