获取休眠中实体的最后一个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的主要内容,如果未能解决你的问题,请参考以下文章