You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring JPA原生查询结合Pageable时count(v)报错问题求助

问题原因

这是Spring Data JPA 2.1.x版本(对应Spring Boot 2.1.6)的已知缺陷——当原生查询包含JOIN和GROUP BY时,自动生成的count语句会错误地使用表别名(比如这里的v)作为count的参数,而MariaDB会把count(v)里的v识别为列名,导致"Unknown column 'v' in 'field list'"错误。你的原生查询写法本身没问题。

解决办法

有两种可行方案:

1. 手动指定count查询

在@Query注解里通过countQuery参数自行编写正确的count统计语句,避免依赖自动生成的逻辑。因为原查询有GROUP BY,count时需要统计去重后的分组数量,示例代码如下:

@Query(nativeQuery = true, 
       value = "SELECT v.id, user_id, aCode, name, creationDate, guid, filename, total "
               + " FROM vContactListByACodeAndSearch v " 
               + " LEFT OUTER JOIN contact_Numbers ln ON ln.contactList_id = v.id " 
               + "WHERE aCode = ?1 " 
               + " AND CONCAT(IFNULL(v.name, ''), IFNULL(ln.contactNumber, '')) LIKE ?2 "
               + "GROUP BY v.id, v.user_id, v.aCode, v.name, v.creationDate, v.guid, v.filename, v.total",
       countQuery = "SELECT COUNT(DISTINCT v.id) "
               + " FROM vContactListByACodeAndSearch v " 
               + " LEFT OUTER JOIN contact_Numbers ln ON ln.contactList_id = v.id " 
               + "WHERE aCode = ?1 " 
               + " AND CONCAT(IFNULL(v.name, ''), IFNULL(ln.contactNumber, '')) LIKE ?2 ")
Page<ContactListModel> findByACodeAndSearchString(String aCode, String search, Pageable page);

注意这里用?1、?2明确参数索引,避免count查询和主查询的参数映射出错。

2. 升级Spring Boot版本

这个问题在Spring Boot 2.2及以上版本中已经被修复,升级到稳定的新版本(比如2.3.x LTS版本),Spring Data JPA会正确生成count语句,无需修改现有查询代码。只需修改pom.xml中的Spring Boot版本号即可:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
关于补丁

Spring官方不会针对旧版本(2.1.x)单独发布补丁,建议优先选择升级版本或者手动指定count查询的方式解决。

内容的提问来源于stack exchange,提问作者scharrua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:17:20