【问题标题】:InvalidDataAccessResourceUsageException while trying to execute sql statement in springboot尝试在 Spring Boot 中执行 sql 语句时出现 InvalidDataAccessResourceUsageException
【发布时间】:2022-11-06 21:35:23
【问题描述】:

我正在尝试执行以下查询以在 Spring Boot 中获取服务器名称。

    @Query(nativeQuery = true, value = "SELECT role FROM sys.geo_replication_links")
    public int getServerName();

我得到以下异常:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:154)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at datadog.trace.instrumentation.springdata.RepositoryInterceptor.invoke(RepositoryInterceptor.java:41)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy266.getServerName(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
at com.sun.proxy.$Proxy237.getServerName(Unknown Source)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'sys.geo_replication_links'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:602)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:524)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7418)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3274)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:446)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)

我不确定为什么我得到sys.geo_replication_links 的无效对象名称。我在 SQL 浏览器中执行了查询,它工作正常。我不确定是否是因为我正在传递的实体。我在现有的一个中添加了这个方法

public interface ReadRepository extends CrudRepository<<ReadEntity, String> 
{
    ReadEntity save(ReadEntity var1);
    @Query(nativeQuery = true, value = "SELECT role FROM sys.geo_replication_links")
    public int getServerName();
}

是因为实体使用错误吗?

【问题讨论】:

  • 你确定方法的返回类型是 int 吗?
  • 我正在从应用程序数据库执行此操作,但 sys.geo_replication_links 在主数据库中。我尝试了这段代码,但没有用... @Query(nativeQuery = true, value = "SELECT partner_server FROM [master].sys.geo_replication_links") public String getServerName();
  • 您是否尝试过在 Sql Server 中执行本机 SQL?如果是,它有效吗?
  • 是的,它有效!唯一的区别是,sys.geo_replication_links 在主数据库中可用,并且在我的应用程序中配置为使用应用程序数据库。
  • @SajitGangadharan,您必须使用主数据库上下文来执行查询,而不是应用程序数据库。在此查询的连接字符串中指定 master

标签: java sql-server spring spring-boot hibernate


【解决方案1】:

sys.geo_replication_links 仅在 Azure SQL 数据库主数据库上下文中可用。在连接字符串中指定主数据库(在 JDBC 连接字符串中包括 databaseName=master)并在查询中使用由两部分组成的名称 (sys.geo_replication_links) 来引用此系统表。为您的正常应用程序数据库访问使用单独的连接字符串 (databaseName=YourDatabase);

请注意,Azure SQL 数据库中的 3 部分名称只能引用当前数据库或 tempdb。您的查询不能使用 3 部分的名称因为该表只存在于master中。

【讨论】:

  • 我收到消息:此版本的 SQL Server 不支持在“master.sys.geo_replication_links”中引用数据库和/或服务器名称。
  • @SajitGangadharan,我改写了我的答案,以更清楚地说明您为什么不能使用 master.sys.geo_replication_links 以及如何查询表格。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2013-07-13
  • 2021-10-08
  • 2017-09-15
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多