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
相关产品推荐
相关产品推荐

