民航电子数据库:Can‘t find index: AggregationProjection(xxx), please add alias for aggregate selections


一、前言

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

六、结果

示例二

在这里插入图片描述


示例三

在这里插入图片描述

  • 31
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值