Получить вставленный идентификатор из 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выглядит все равно работает для меня.

Надеюсь это поможет

Другие вопросы по тегам