Spring Data JPA nativeQuery 的问题,在线跪求大佬解答。
背景:本人不会 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 语句就不对了?如果是使用姿势不对,那该怎么解决啊?[快哭了]