MyBatis Plus分页插件使用问题
一、问题描述
项目中遇到SQL报错抛异常,报错内容如下。
[Code: 1248, SQL State: 42000] Every derived table must have its own alias
查看报错的SQL如下:
SELECT * FROM (
SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ......
很明显,ROWNUM是属于Oracle的语法,而把出错的语句放到Oracle环境下执行是没有问题的。而放在MySQL下才会有问题。而问题的根源在于MyBatis Plus分页插件所使用的方言导致的。因为MyBatis的子查询并不需要别名(alias)。当然,即使手动把SQL语句加上别名,执行SQL也依然会报其他错误,因为MySQL没有ROWNUM的概念。通常情况下,都会根据Every derived table must have its own alias到网上找解决方案,结果无一例外的提示需要给表加别名。
二、解决方案
配置mybatis-config.xml文件,找到
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库--> <property name="helperDialect" value="oracle"/> </plugin> </plugins>
value=“oracle”改为value=“mysql”
<?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>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="false"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
<!-- mybatis sql打印到log4j文件-->
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 类型别名
<typeAliases>
<typeAlias alias="Page" type="com.grgbanking.atmc.model.VersionMain"/>
</typeAliases>
-->
<!-- 插件配置-->
<!--
<plugins>
<plugin interceptor="com.grgbanking.common.persistence.interceptor.PaginationInterceptor"/>
</plugins>
-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="helperDialect" value="oracle"/>
</plugin>
</plugins>
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle" />
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="DB2" />
</databaseIdProvider>
</configuration>