Получить вставленный идентификатор из NativeQuery Hibernate 5.2+
Я использую следующий код для запуска собственных запросов SQL в спящем режиме (SQLQuery) устарела.
private static int executeUpdate(String sql) {
int result = 0;
Session session = HibernateSessionFactory.getSession();
org.hibernate.Transaction tr = session.beginTransaction();
NativeQuery nativeQuery = session.createNativeQuery(sql);
int executeUpdate = nativeQuery.executeUpdate();
tr.commit();
return executeUpdate;
}
Все работает нормально, но я хочу, чтобы тот же метод также возвращал идентификатор последнего вставленного элемента, я хочу, чтобы способ был независимым от таблицы.
[[РЕДАКТИРОВАТЬ]]
Одним из способов сделать это может быть передача собственного запроса с returning id
и затем используйте этот код:
private static int executeUpdate(String sql) {
int result = 0;
List<HashMap<String, Object>> ret = new ArrayList<HashMap<String, Object>>();
Session session = HibernateSessionFactory.getSession();
org.hibernate.Transaction tr = session.beginTransaction();
NativeQuery nativeQuery = session.createNativeQuery(sql);
ret = nativeQuery.list();
tr.commit();
return Integer.parseInt(ret.get(0).get("id").toString());
}
Может ли быть какой-то другой путь?
1 ответ
Вы можете сделать это с getSingleResult()
в вашем примере
private static int executeUpdate(String sql) {
int result = 0;
Session session = HibernateSessionFactory.getSession();
org.hibernate.Transaction tr = session.beginTransaction();
NativeQuery nativeQuery = session.createNativeQuery(sql);
//here I'm assuming you are getting a BigInteger as result, change accordingly
BigInteger executeUpdate = (BigInteger) nativeQuery.getSingleResult();
tr.commit();
return executeUpdate;
}
Даже если Javadoc говорит, что getSingleResult()
используется для SELECT
выглядит все равно работает для меня.
Надеюсь это поможет