2016-01-31 138 views
1

實體的最後一個ID,我需要一種方法來獲取數據庫實體的最後一個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; 
     } 


    } 
+0

在Postgres手冊中,您是否找到該語法? http://www.postgresql.org/docs/current/static/functions-sequence.html –

+0

當我在postgresql中執行此查詢時:從purchase_idpurchase_seq中選擇last_value,我得到一個結果,但我不知道要在休眠 –

+0

不,我不使用certeria –

回答

0

嘗試使用這樣的:

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

而得到的值試試這個:

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

我假設你有一個實體purchase_idpurchase_seq

嘗試看看這個site

+0

purchase_idpurchase_seq是數據庫中的序列,購買是實體 –

+0

@abdouamer請參閱上面的鏈接它有幫助 – Abdelhak

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; 
     } 


    } 
+0

您**有**使用'currval()'或'lastval()'(我已經發布在我的第一個鏈接評論)來獲取最近生成的序列值。如果多個事務正在修改數據庫,那麼您的代碼無法正常工作。另外:我非常確定Hibernate應該能夠自己做到這一點。 Hibernate沒有「SequenceGenerator」註釋 –