一、前言
1、对接民航电子数据库
2、框架:ShardingSphere + caedb
3、执行select时报错
二、SQL示例
注:以下示例都是基于ShardingSphere + caedb
框架
示例一:使用PageHelper
进行分页查询,涉及count()函数
,涉及分库,不涉及跨表
Preparing: SELECT count(0) FROM t_mb_orderurlcfg ouc LEFT JOIN t_mb_config c ON ouc.originId = c.ID WHERE ouc.vdnId = ?
Parameters: 1(Integer)
以上SQL可正常执行
示例二:手写SQL进行查询,涉及count()函数
,涉及分库,不涉及跨表
Preparing: select count(1) from t_mb_message where isSend='1' and sessionType != '1' AND openId = ? AND CreateTime BETWEEN ? AND ? AND vdnId = ?
Parameters: 1_90D5KHa3O_243fo(String), 2024-02-29 07:03:05.448(Timestamp), 2024-04-30 07:03:05.448(Timestamp), 1(String)
以上SQL执行报错
报错信息
### Error querying database. Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
### The error may exist in file [/home/xxx/devtest/online/tomcat8-ass-cloud-web-8087/webapps/FS_WEB_ASS_WEB/WEB-INF/classes/mappings/UserDao.xml]
### The error may involve com.xxx.dao.UserDao.findSendHisMsgCount
### The error occurred while handling results
### SQL: select count(1) from t_mb_message where isSend='1' and sessionType != '1' AND openId = ? AND CreateTime BETWEEN ? AND ? AND vdnId = ?
### Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
### The error may exist in file [/home/xxx/devtest/online/tomcat8-ass-cloud-web-8087/webapps/FS_WEB_ASS_WEB/WEB-INF/classes/mappings/UserDao.xml]
### The error may involve com.xxx.dao.UserDao.findSendHisMsgCount
### The error occurred while handling results
### SQL: select count(1) from t_mb_message where isSend='1' and sessionType != '1' AND openId = ? AND CreateTime BETWEEN ? AND ? AND vdnId = ?
### Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy96.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy99.findSendHisMsgCount(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:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy100.findSendHisMsgCount(Unknown Source)
at com.xxx.service.impl.UserServiceImpl.getHisMsgCount(UserServiceImpl.java:81)
at com.xxx.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$e55ebb29.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.xxx.datasource.DataSourceAspect.around(DataSourceAspect.java:47)
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.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.xxx.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$2d0dda05.getHisMsgCount(<generated>)
at com.xxx.socket.hander.WebSocketAndSocketUtil.IM_CCS_RequestHisMsg(WebSocketAndSocketUtil.java:465)
at com.xxx.socket.hander.WebSocketAndSocketUtil.process(WebSocketAndSocketUtil.java:102)
at com.xxx.socket.hander.WebSocketAndSocketUtil$$FastClassBySpringCGLIB$$92851630.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.xxx.socket.hander.WebSocketAndSocketUtil$$EnhancerBySpringCGLIB$$6f12877a.process(<generated>)
at com.xxx.socket.hander.MessageSocketHandler.handleMessage(MessageSocketHandler.java:65)
at org.springframework.web.socket.handler.WebSocketHandlerDecorator.handleMessage(WebSocketHandlerDecorator.java:75)
at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:113)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:42)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:84)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:81)
at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:390)
at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:130)
at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:484)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:284)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:130)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:85)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:932)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1694)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
示例三:手写SQL进行查询,涉及count()函数
,涉及分库,涉及跨表
以上SQL执行报错
报错信息
2024-04-29 21:26:05.372 - [DEBUG] - [http-nio-8087-exec-10] - [c.xxx.dao.UserDao.findHisMsgCountByIReportNew - line:159]: ==> Preparing: select count(1) from t_mb_message4rpt where sessionType = 1 AND openId = ? AND subTableDate BETWEEN ? AND ? AND vdnId = ?
2024-04-29 21:26:05.372 - [DEBUG] - [http-nio-8087-exec-10] - [c.xxx.dao.UserDao.findHisMsgCountByIReportNew - line:159]: ==> Parameters: 1_90D5KHa3O_243fo(String), 2024-02-29 05:26:03.243(Timestamp), 2024-04-30 05:26:03.243(Timestamp), 1(Integer)
2024-04-29 21:26:05.373 - [INFO ] - [http-nio-8087-exec-10] - [c.f.d.algorithm.ModuloShardingDatabaseAlgorithm - line:20]: databases collection is [[ireport0, ireport1]], precise sharding value is [PreciseShardingValue(logicTableName=t_mb_message4rpt, columnName=vdnId, value=1)]
2024-04-29 21:26:05.373 - [INFO ] - [http-nio-8087-exec-10] - [c.f.d.algorithm.ModuloShardingDatabaseAlgorithm - line:25]: use databases name is [ireport1]
2024-04-29 21:26:05.373 - [INFO ] - [http-nio-8087-exec-10] - [c.f.d.algorithm.DateTimeShardingTableAlgorithm - line:46]: range table collection is [[t_mb_message4rpt_202401, t_mb_message4rpt_202402, t_mb_message4rpt_202403, t_mb_message4rpt_202404, t_mb_message4rpt_202405, t_mb_message4rpt_202406, t_mb_message4rpt_202407, t_mb_message4rpt_202408, t_mb_message4rpt_202409, t_mb_message4rpt_202410, t_mb_message4rpt_202411, t_mb_message4rpt_202412]], range sharding value is [RangeShardingValue(logicTableName=t_mb_message4rpt, columnName=subTableDate, valueRange=[2024-02-29 05:26:03.243..2024-04-30 05:26:03.243])]
2024-04-29 21:26:05.374 - [INFO ] - [http-nio-8087-exec-10] - [c.f.d.algorithm.DateTimeShardingTableAlgorithm - line:67]: use table name is [[t_mb_message4rpt_202402, t_mb_message4rpt_202403, t_mb_message4rpt_202404]]
2024-04-29 21:26:05.379 - [ERROR] - [http-nio-8087-exec-10] - [com.xxx.service.impl.UserServiceImpl - line:128]: 查询访客历史会话聊天记录出现异常(从报表库中获取),详情为:nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
### The error may exist in file [/home/xxx/devtest/online/tomcat8-ass-cloud-web-8087/webapps/FS_WEB_ASS_WEB/WEB-INF/classes/mappings/UserDao.xml]
### The error may involve com.xxx.dao.UserDao.findHisMsgCountByIReportNew
### The error occurred while handling results
### SQL: select count(1) from t_mb_message4rpt where sessionType = 1 AND openId = ? AND subTableDate BETWEEN ? AND ? AND vdnId = ?
### Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
### The error may exist in file [/home/xxx/devtest/online/tomcat8-ass-cloud-web-8087/webapps/FS_WEB_ASS_WEB/WEB-INF/classes/mappings/UserDao.xml]
### The error may involve com.xxx.dao.UserDao.findHisMsgCountByIReportNew
### The error occurred while handling results
### SQL: select count(1) from t_mb_message4rpt where sessionType = 1 AND openId = ? AND subTableDate BETWEEN ? AND ? AND vdnId = ?
### Cause: java.lang.IllegalStateException: Can't find index: AggregationProjection(type=COUNT, innerExpression=(1), alias=Optional.empty, derivedAggregationProjections=[], index=-1), please add alias for aggregate selections
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy96.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy99.findHisMsgCountByIReportNew(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:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy100.findHisMsgCountByIReportNew(Unknown Source)
at com.xxx.service.impl.UserServiceImpl.getHisMsgCountByIReportNew(UserServiceImpl.java:126)
at com.xxx.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$e55ebb29.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.xxx.datasource.DataSourceAspect.around(DataSourceAspect.java:47)
at sun.reflect.GeneratedMethodAccessor157.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.xxx.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$b1a4e816.getHisMsgCountByIReportNew(<generated>)
at com.xxx.socket.hander.WebSocketAndSocketUtil.IM_CCS_RequestHisMsg(WebSocketAndSocketUtil.java:471)
at com.xxx.socket.hander.WebSocketAndSocketUtil.process(WebSocketAndSocketUtil.java:102)
at com.xxx.socket.hander.WebSocketAndSocketUtil$$FastClassBySpringCGLIB$$92851630.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.xxx.socket.hander.WebSocketAndSocketUtil$$EnhancerBySpringCGLIB$$f3a9958b.process(<generated>)
at com.xxx.socket.hander.MessageSocketHandler.handleMessage(MessageSocketHandler.java:65)
at org.springframework.web.socket.handler.WebSocketHandlerDecorator.handleMessage(WebSocketHandlerDecorator.java:75)
at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:113)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:42)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:84)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:81)
at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:390)
at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:130)
at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:484)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:284)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:130)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:85)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:932)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1694)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
示例四:使用PageHelper
进行分页查询,涉及count()函数
,涉及分库,涉及跨表
报错信息与示例三一直,这里就省略掉了
三、原因
select涉及函数时,未给字段结果定义别名
示例三、示例四的具体原因应该是ShardingSphere
进行跨表查询后,需要合并结果,由于字段没有起别名,导致合并的时候报错
至于示例二,原因不明
四、解决
select查询时如果涉及函数,未其加上别名即可
1、如果是手写的SQL直接加上别名即可
2、如果是PageHelper
,可自定义PageHelper
方言
1、编写方言类CustomDialect和CustomCountSqlParser
CustomCountSqlParser类
package com.xxx.dialect;
import com.github.pagehelper.parser.CountSqlParser;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.*;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 自定义CountSql
**/
public class CustomCountSqlParser extends CountSqlParser {
private static final Alias TABLE_ALIAS = new Alias("table_count");
/**
* 重写sqlToCount
* @param select
* @param name
*/
@Override
public void sqlToCount(Select select, String name) {
SelectBody selectBody = select.getSelectBody();
List<SelectItem> COUNT_ITEM = new ArrayList();
// 增加别名total
COUNT_ITEM.add(new SelectExpressionItem(new Column("count(" + name + ") as total")));
if (selectBody instanceof PlainSelect && this.isSimpleCount((PlainSelect)selectBody)) {
((PlainSelect)selectBody).setSelectItems(COUNT_ITEM);
} else {
PlainSelect plainSelect = new PlainSelect();
SubSelect subSelect = new SubSelect();
subSelect.setSelectBody(selectBody);
subSelect.setAlias(TABLE_ALIAS);
plainSelect.setFromItem(subSelect);
plainSelect.setSelectItems(COUNT_ITEM);
select.setSelectBody(plainSelect);
}
}
}
CustomDialect类
package com.xxx.dialect;
import com.github.pagehelper.dialect.helper.MySqlDialect;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.RowBounds;
/**
* @description: 自定义方言 兼容国产数据库
**/
public class CustomDialect extends MySqlDialect {
public CustomDialect() {
this.countSqlParser = new CustomCountSqlParser();
}
@Override
public String getCountSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey countKey) {
return this.countSqlParser.getSmartCountSql(boundSql.getSql());
}
}
application配置方言(yml)
pagehelper:
helper-dialect: 全限定类名.CustomDialect