MyBatis with postgres throws "ERROR: relation "dual" does not exist"
MyBatis with postgres throws "ERROR: relation "dual" does not exist"
我正在使用 MyBatis 在 java 基于 Web 的应用程序的 postgres 数据库中做一个非常简单的 select
设置如下:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
以及以下驱动程序:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.2-1004-jdbc41</version>
</dependency>
映射器如下所示:
<select id="getLicenseUsage" parameterType="long" resultMap="licenseUsage">
select ('1970-01-01 00:00:00 GMT'::timestamp + (event_time/1000)::text::interval)::date as day, license_key, count(distinct event_id) as recos, max(id) as venm_id
from venm_raw
where target_id is not null and id > #{fromId}
group by license_key,day;
</select>
当我执行此查询时,出现以下错误:
"ERROR: relation "dual" does not exist"
从网上的不同阅读来看,似乎 MyBatis 正在幕后寻找一个名为 "dual" 的 table,它存在于 Oracle 但不存在于 postgres 中。这只是目前的猜测。
我被困在这里,非常感谢帮助。提前致谢。
完整跟踪如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ERROR: relation "dual" does not exist)
### The error may exist in file [/opt/tomcat/webapps/ROOT/WEB-INF/classes/META-INF/mappers/redshift/LicenseUsageMapper.xml]
### The error may involve com.qualcomm.vuforia.redshift.mappers.LicenseUsageMapper.getLicenseUsage
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ERROR: relation "dual" does not exist)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
at com.sun.proxy.$Proxy36.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:198)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
at com.sun.proxy.$Proxy49.getLicenseUsage(Unknown Source)
at com.qualcomm.vuforia.sumtables.summarizers.SummarizerProcessor.process(SummarizerProcessor.java:60)
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
根据您没有任何配置设置的回复,我怀疑这可能是问题的症结所在。
查看 Getting Started Guide for an overview, and the config section 了解更多详情。
他们在 入门 教程中列出的示例配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
这又挂接到 properties 文件以设置环境变量,例如 ${driver}
等
尤其是,您可能希望关注这些设置:
<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/db"/>
其中 localhost
更改为您的主机名,而 db
是您的数据库的名称。 5432
通常是 Postgres 的默认端口,但如果您的端口不是标准端口,您也需要更改它。
查看错误的堆栈跟踪,我可以说使用了 apache 数据库连接池。看起来它已将 validationQuery
配置为类似 SELECT 1 FROM dual
的内容。 mybatis 本身不使用 dbcp 并且有自己的池化数据源实现,所以这个 dbcp 是在你的项目中配置的东西。
因为您能够确定 dual
在 postgres 中不存在,所以您需要将该查询更改为 SELECT 1
。 dbcp 的使用方法有很多种,因此您需要了解它在您的项目中是如何使用和配置的。
您正在使用 spring,所以很可能您在 spring 上下文中配置了 BasicDataSource,并设置了 validationQuery
。
另一种方法是在您的项目中对 dual
进行全文搜索。
我正在使用 MyBatis 在 java 基于 Web 的应用程序的 postgres 数据库中做一个非常简单的 select
设置如下:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
以及以下驱动程序:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.2-1004-jdbc41</version>
</dependency>
映射器如下所示:
<select id="getLicenseUsage" parameterType="long" resultMap="licenseUsage">
select ('1970-01-01 00:00:00 GMT'::timestamp + (event_time/1000)::text::interval)::date as day, license_key, count(distinct event_id) as recos, max(id) as venm_id
from venm_raw
where target_id is not null and id > #{fromId}
group by license_key,day;
</select>
当我执行此查询时,出现以下错误:
"ERROR: relation "dual" does not exist"
从网上的不同阅读来看,似乎 MyBatis 正在幕后寻找一个名为 "dual" 的 table,它存在于 Oracle 但不存在于 postgres 中。这只是目前的猜测。
我被困在这里,非常感谢帮助。提前致谢。
完整跟踪如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ERROR: relation "dual" does not exist)
### The error may exist in file [/opt/tomcat/webapps/ROOT/WEB-INF/classes/META-INF/mappers/redshift/LicenseUsageMapper.xml]
### The error may involve com.qualcomm.vuforia.redshift.mappers.LicenseUsageMapper.getLicenseUsage
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ERROR: relation "dual" does not exist)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
at com.sun.proxy.$Proxy36.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:198)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
at com.sun.proxy.$Proxy49.getLicenseUsage(Unknown Source)
at com.qualcomm.vuforia.sumtables.summarizers.SummarizerProcessor.process(SummarizerProcessor.java:60)
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
根据您没有任何配置设置的回复,我怀疑这可能是问题的症结所在。
查看 Getting Started Guide for an overview, and the config section 了解更多详情。
他们在 入门 教程中列出的示例配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
这又挂接到 properties 文件以设置环境变量,例如 ${driver}
等
尤其是,您可能希望关注这些设置:
<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/db"/>
其中 localhost
更改为您的主机名,而 db
是您的数据库的名称。 5432
通常是 Postgres 的默认端口,但如果您的端口不是标准端口,您也需要更改它。
查看错误的堆栈跟踪,我可以说使用了 apache 数据库连接池。看起来它已将 validationQuery
配置为类似 SELECT 1 FROM dual
的内容。 mybatis 本身不使用 dbcp 并且有自己的池化数据源实现,所以这个 dbcp 是在你的项目中配置的东西。
因为您能够确定 dual
在 postgres 中不存在,所以您需要将该查询更改为 SELECT 1
。 dbcp 的使用方法有很多种,因此您需要了解它在您的项目中是如何使用和配置的。
您正在使用 spring,所以很可能您在 spring 上下文中配置了 BasicDataSource,并设置了 validationQuery
。
另一种方法是在您的项目中对 dual
进行全文搜索。