Je veux récupérer l'id de la dernière valeur insérée dans Hibernate.
Après la recherche:
Long lastId = ((Long) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
Mais le code suivant me donne cette erreur:
Java.lang.ClassCastException: Java.math.BigInteger ne peut pas être converti en Java.lang.Long
S'il vous plaît partagez vos pensées!
Solution
Long lastId = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
N'oubliez pas d'importer:
importer Java.math.BigInteger;
L'erreur est assez claire. Il retourne BigInteger
et non long
Vous devez l'assigner à un BigInteger
. Et obtenez longValue()
de celui-ci.
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;
}
Vous pouvez simplement utiliser save qui renvoie un objet Serializable qui est en réalité le dernier identifiant d'insertion. Exemple de code:
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;
Un test:
int result = paperService.save(paper);
System.out.println("The id of the paper you just added is: "+result);
et voici la sortie:
The id of the paper you just added is: 3032
Puisque le type de retour de uniqueResult()
est BigInteger
et non Long
, procédez comme suit:
long lastId = session.createSQLQuery("SELECT LAST_INSERT_ID()")
.uniqueResult() // this returns a BigInteger
.longValue(); // this will convert it to a long value
La méthode uniqueResult()
ne renvoie qu'un BigInteger à cause de votre requête SELECT LAST_INSERT_ID()
.