Hibernateで最後に挿入された値のIDを取得したい。
検索後:
Long lastId = ((Long) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
しかし、次のコードは私にこのエラーを与えます:
Java.lang.ClassCastException:Java.math.BigIntegerをJava.lang.Longにキャストできません
あなたの考えを共有してください!
解決策
Long lastId = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
インポートすることを忘れないでください:
インポートJava.math.BigInteger;
エラーはかなり明確です。 BigInteger
ではなく long
を返します
BigInteger
に割り当てる必要があります。そして、そこから longValue()
を取得します。
public Integer save(Smartphones i) {
int id = 0;
Session session=HibernateUtil.getSessionFactory().openSession();
Transaction trans=session.beginTransaction();
try{
session.save(i);
id=i.getId();
trans.commit();
}
catch(HibernateException he){}
return id;
}
実際に最後の挿入IDであるSerializableオブジェクトを返すsaveを使用するだけです。サンプルコード:
Session session=this.getSessionFactory().getCurrentSession();
int result = -1;
try {
Serializable ser = session.save(paper);
if (ser != null) {
result = (Integer) ser;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
テスト実行:
int result = paperService.save(paper);
System.out.println("The id of the paper you just added is: "+result);
そしてここに出力があります:
The id of the paper you just added is: 3032
uniqueResult()
の戻り値の型はBigInteger
ではなくLong
であるため、次のようにする必要があります。
_long lastId = session.createSQLQuery("SELECT LAST_INSERT_ID()")
.uniqueResult() // this returns a BigInteger
.longValue(); // this will convert it to a long value
_
メソッドuniqueResult()
は、クエリSELECT LAST_INSERT_ID()
のため、BigIntegerのみを返します。