从NativeQuery Hibernate 5.2+插入ID

时间:2018-07-25 08:30:30

标签: hibernate postgresql-9.5 hibernate-5.x nativequery hibernate-native-query

我不建议使用以下代码在休眠(SQLQuery)上运行本机sql查询。

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

一切正常,但我希望使用相同的方法还可以返回最后插入的元素的ID,我希望该方法与表无关。

[[编辑]]

一种方法是通过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 个答案:

答案 0 :(得分:0)

在您的示例中,您可以使用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,对于我来说还是可以正常工作。

希望这会有所帮助