MyBatis与postgres抛出"错误:关系" dual"不存在"

时间:2015-01-19 17:15:13

标签: postgresql mybatis

我正在使用MyBatis在基于java web的应用程序中的postgres数据库中进行非常简单的选择

设置如下:

    <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正在寻找名为&#34; dual&#34;它存在于Oracle中但不存在于postgres中。这只是一个猜测。

我被困在这里,非常感谢。 Thx提前。

以下全文:

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)

2 个答案:

答案 0 :(得分:3)

查看错误的堆栈跟踪,我可以说使用了apache数据库连接池。它似乎已将validationQuery配置为SELECT 1 FROM dual之类的内容。 mybatis本身不使用dbcp,并且有自己的池数据源实现,因此这个dbcp是在项目中配置的。

正如您能够发现postgres中不存在dual所以您需要将该查询更改为SELECT 1。有许多方法可以使用dbcp,因此您需要了解它在项目中的使用和配置方式。

你正在使用spring,所以很可能你在validationQuery设置的spring语境中配置了BasicDataSource

另一种方法是在项目中对dual进行全文搜索。

答案 1 :(得分:1)

根据您的回复,您没有任何配置设置,我怀疑这可能是问题的症结所在。

查看Getting Started Guide以获取概述,并查看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>

反过来又连接到属性文件来设置环境变量,例如${driver}等。

特别是,您可能希望专注于这些设置:

<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/db"/>

localhost更改主机名,db是数据库的名称。 5432通常是 Postgres 的默认端口,但如果您的端口是非标准端口,您也需要更改它。