【问题标题】:How to execute native query and get feedback?如何执行原生查询并获得反馈?
【发布时间】:2020-05-06 22:56:53
【问题描述】:

如何在 java 中执行本机查询(创建表),并返回获取有关操作是否成功的信息。我尝试过的每一种方法总是一样的。查询正在运行,但我收到有关“该查询有多糟糕”的错误,但正如我所说它有效。

try{
      session.createNativeQuery("create table test (id number)").getResultList()
}
catch(Exception e){
    // I am getting error "Could not extract result set metadata"
    // Is there any way to execute getResultList() only if operation was select?
}

总结一下,我需要执行 CRUD。
1. 如果执行了“选择”,我需要结果列表。
2. 如果“创建”我不想执行 getResultSet()
3. 如果执行了“插入”,我需要有关受影响行数的信息。
等等... ... ...
最重要的是,我总是需要有关最终错误的信息!如果查询缺少语法或某些东西,我总是需要获取该信息。

有人可以帮帮我吗?几天来我一直在与这个作斗争......

【问题讨论】:

  • 我们无法评论您未发布的代码和错误。您对 createNativeQuery 的尝试不起作用,因为您创建了一个查询,但从不执行它。您对 prepareStatement 的尝试没有达到您想要的效果,因为...您忽略了它返回的内容,并且没有遵循 javadoc 中的说明以获得结果:docs.oracle.com/javase/8/docs/api/java/sql/…。使用executeUpdate() 会更简单,但您也不需要忽略结果。阅读 javadoc。
  • createNativeQuery() 被执行。在该行之后,我的数据库中有所有内容。已执行,但这永远不会为我返回任何反馈。
  • 不,不是。不在您发布的代码中。如果您的实际代码不同,并且您希望我们解释您的实际代码存在什么问题以及如何修复它,请发布您的实际代码。
  • 你是对的,对不起,这是一个不好的例子......但是关于元数据的“错误”仍然困扰着我......当我执行查询时,我不想得到对象的结果集“创建”
  • 不要。 getResultList() 用于...从 SELECT 查询中获取结果列表。你不想那样做。使用 executeUpdate()。

标签: java sql spring hibernate jdbc


【解决方案1】:

使用本机查询的简单示例。可以根据affected rows的值判断查询结果。

        EntityTransaction entityTransaction;
        EntityManager entityManager;

        try
        {
            entityTransaction = entityManager.getTransaction();

            entityTransaction.begin();

            // rowsUpdated - The number of "affected rows".
            int rowsUpdated = entityManager.createNativeQuery("create table test (id nubmer)").executeUpdate();

            entityTransaction.commit();
        }
        catch (HibernateException | IllegalStateException e)
        {
            // handle exceptions

            if (entityTransaction != null && entityTransaction.isActive())
            {
                entityTransaction.rollback();
            }
        }

【讨论】:

  • 非常感谢,但我对最后一个如果有疑问。编译器究竟什么时候会进入呢?
  • 这是一个非常简单的例子,捕获所有异常并不是很好。我用特定的例外代替。如果entityTransactionnull,最后一个if 检查是为了避免NullPointerException,并在回滚事务之前确保事务处于活动状态。在这种情况下,if 将在try 块内的代码抛出HibernateExceptionIllegalStateException 时执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多