【问题标题】:Get inserted Id from NativeQuery Hibernate 5.2+从 NativeQuery Hibernate 5.2+ 获取插入的 ID
【发布时间】:2019-01-02 00:01:37
【问题描述】:

我使用以下代码在休眠 (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());
    }

还有其他方法吗?

【问题讨论】:

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


    【解决方案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,对我来说仍然有效。

    希望对你有帮助

    【讨论】:

    • Nope 失败并抛出,14:52:25.359 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - No results were returned by the query.
    • 方法结果的差异可能与底层SQL引擎有关。我使用 PostgreSQL,在这种情况下它失败了。将该标签添加到问题中。
    • 可能是,我试过不同的数据库没有任何错误:(
    • 未记录的功能往往表现得像这样:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2014-04-18
    • 2016-08-27
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多