背景:本人不会 java,但是基本上能够看懂逻辑,维护一个老 java 项目,现在遇到一个慢查询的问题( mysql 最后选择了一个错误的索引),不考虑数据库表的修改,索引都是正常的。
spring-data-jpa 版本:1.6.5 。
问题描述如下:
首先 status 是一个枚举。然后有下面有两个基于 JPA 查询数据的方法
public enum Status {
UPLOADING, // 0
PROCESSING, // 1
PUBLISHED, // 2
FAILED, // 3
DELETED; // 4
}
// 方法一:生成的 sql 存在慢查询问题( mysql 选择了一个错误的索引)
Slice<Document> findByUserIdAndStatusIn(String userId, Collection<Status> status, Pageable pageable);
// 方法二:使用 nativeQuery,指定使用的索引
@Query(value = "select * from #{#entityName} use index (userId_createTime_idx) "
+ " where userId = :userId and status in :status "
+ " order by createTime desc "
+ " limit :offset,:size",
nativeQuery = true)
List<Document> findByUserIdAndStatusInUseIndex(@Param("userId") String userId,
@Param("status") Collection<Status> status,
@Param("offset") int limitOffset,
@Param("size") int limitSize);
第一个方法最后生成的 sql 语句是正常的,比如
status in (1,2,3)
第二个方法是新增的,使用 nativeQuery 指定使用索引,但基于同样的参数Collection<Status> status
生成的 sql 语句,就不正常,比如
// 里面的...翻译后,涉及敏感信息,故用...代替
status in (
x'...2E706C6174666F726D2E6D6F64656C2E646F63756D656E742E53746174757300000000000000001200007872000E6A6176612E6C616E672E456E756D0000000000000000120000787074000A50524F43455353494E47',
x'...2E706C6174666F726D2E6D6F64656C2E646F63756D656E742E53746174757300000000000000001200007872000E6A6176612E6C616E672E456E756D000000000000000012000078707400095055424C4953484544',
x'...2E706C6174666F726D2E6D6F64656C2E646F63756D656E742E53746174757300000000000000001200007872000E6A6176612E6C616E672E456E756D000000000000000012000078707400064641494C4544')
这几个莫名的字符,经过翻译之后,是这样的
.platform.model.document.Status xr java.lang.Enum xpt
PROCESSING
.platform.model.document.Status xr java.lang.Enum xpt PUBLISHED
.platform.model.document.Status xr java.lang.Enum xpt FAILED
所以,使用 nativeQuery 之后,为什么同样的参数Collection<Status> status
最后生成的 sql 语句就不对了?如果是使用姿势不对,那该怎么解决啊?[快哭了]
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.