首页 > 其他分享 >解决GROUP_CONCAT结果长度被限制问题

解决GROUP_CONCAT结果长度被限制问题

时间:2024-07-09 09:57:58浏览次数:13  
标签:GROUP max len group SESSION concat 长度 CONCAT dataSource

解决GROUP_CONCAT结果长度被限制问题

//这是我的sql语句
<select id="statByClassByCreateTimeAndType"  resultType="StatItemVo">
		select class_id as group_id, class_name as group_name, result, count(user_id) num, GROUP_CONCAT(user_name SEPARATOR '、') AS userNameList from t_ems_dorm_check_record
		where school_id = #{schoolId}
		<if test="classId!=null">and class_id = #{classId}</if>
		<if test="startTime!=null">and check_date >= #{startTime}</if>
		<if test="endTime!=null">and #{endTime} >= check_date</if>
		<if test="confId!=null">and conf_id = #{confId}</if>
		<if test="userName !='' and userName != null"> AND user_name LIKE CONCAT('%',#{userName},'%')</if>
		<if test="result!=null">and result = #{result}</if>
		group by class_id, result
		<if test="sort == 1">
			ORDER BY num DESC
		</if>
		<if test="sort == 2">
			ORDER BY class_name DESC
		</if>
	</select>

得到的结果

{"groupId":617411,"groupName":"19高级数控加工1952班","num":720,"userNameList":"李晓曦、黄
祖宜、赵大志、林薇薇、陈紫函、李安然、郑淑仪、莫慧敏、程峰、黄远程、黄浩然、林子轩、江与城、林少杰、
邵杰、黄冠、李洋、刘洋、孙绍文、马海成、黄志毅、吴敬梓、邓凯文、林宇轩、李晓曦、黄祖宜、赵大志、林薇
薇、陈紫函、李安然、郑淑仪、莫慧敏、程峰、黄远程、黄浩然、林子轩、江与城、林少杰、邵杰、黄冠、李洋、
刘洋、孙绍文、马海成、黄志毅、吴敬梓、邓凯文、林宇轩、李晓曦、黄祖宜、赵大志、林薇薇、陈紫函、李安
然、郑淑仪、莫慧敏、程峰、黄远程、黄浩然、林子轩、江与城、林少杰、邵杰、黄冠、李洋、刘洋、孙绍文、马
海成、黄志毅、吴敬梓、邓凯文、林宇轩、李晓曦、黄祖宜、赵大志、林薇薇、陈紫函、李安然、郑淑仪、莫慧
敏、程峰、黄远程、黄浩然、林子轩、江与城、林少杰、邵杰、黄冠、李洋、刘洋、孙"},

//这里的num是求总和,这里怎么看也不像是有720的样子,于是就开始怀疑是count(user_id) num函数的问
//题,或者是分组的问题,但是无论怎么改都没用,到后面才发现是GROUP_CONCAT函数的输出可能被限制了长
//度,于是开始查询资料,可以通过改变group_concat_max_len的值拿到全部数据

接下来开始说解决方法,先说第一种,也是我推荐的一种

//在mapper接口定义
@Insert("SET SESSION group_concat_max_len=1024000")
    void setGroupConcatMaxLen();
//在调用mapper接口前调用即可	    
	    dormCheckRecordDao.setGroupConcatMaxLen();
        statItemVos = dormCheckRecordDao.statByClassByCreateTimeAndType(dormCheckRecordVo);

第二种

//在mysql中设置,但是这种方法需要重启数据库,生产环境不可能随便重启,如果是个人项目的话,随便搞
SHOW VARIABLES LIKE "group_concat_max_len";
SET SESSION group_concat_max_len = 10240000;

第三种

@Autowired
JdbcTemplate jdbcTemplate;
// 设置 group_concat_max_len 只在这个连接上生效
jdbcTemplate.execute("SET SESSION group_concat_max_len = 1000000");
//这种方法我没有成功,我怀疑是配置文件的问题,但是公司这个项目又老又大,好几个配置文件,我不敢改,果断放弃

第四种

	@Autowired
    private SqlSessionFactory sqlSessionFactory;

    public List<StatItemVo> getStats(YourParams params) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            // 获取当前连接
            Connection conn = sqlSession.getConnection();
            // 使用原生JDBC执行SET SESSION命令
            try (Statement stmt = conn.createStatement()) {
                stmt.executeUpdate("SET SESSION group_concat_max_len = 1000000");
            }
            // 现在执行你的MyBatis查询
            YourMapper mapper = sqlSession.getMapper(YourMapper.class);
            return mapper.statByClassByCreateTimeAndType(params);
        } catch (SQLException e) {
            // 处理异常
            throw new RuntimeException(e);
        }
    }
//这种方法我也没成功,不知道为什么,也是怀疑配置文件没有返回代码对象,但是我改不了

第五种

//直接修改配置
 @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");

        // 设置初始化SQL
        CompositeResourceBundle resourceBundle = new CompositeResourceBundle();
        resourceBundle.add(new ByteArrayResource("SET SESSION group_concat_max_len=1000000".getBytes()));
        dataSource.setConnectionProperties(resourceBundle);

        return dataSource;
    }
spring:
  datasource:
    tomcat:
      init-sql: SET SESSION group_concat_max_len=100000
spring.datasource.tomcat.init-sql=SET SESSION group_concat_max_len=100000

标签:GROUP,max,len,group,SESSION,concat,长度,CONCAT,dataSource
From: https://blog.csdn.net/java_rutu/article/details/140273938

相关文章