自定义@Query 中使用分页

来源:互联网 发布:网络销售的薪资 编辑:程序博客网 时间:2024/06/06 05:41

1.问题由来:

有一个比较复杂的sql请求,所以自定义sql写起来比较顺手,也比较清晰,但是不能直接使用,Pageable进行分页,需要进行一系列配置。

2.解决方案:

public interface UserRepository extends JpaRepository<User, Long> {  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1 ORDER BY ?#{#pageable}",    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",    nativeQuery = true)  Page<User> findByLastname(String lastname, Pageable pageable);}

这是stackoverflow上的一段代码,使用于mysql。
值得一提的是,这个 ORDER BY ?#{#pageable} 非常关键,没有的话会报错,而且不同的数据库,这个地方的表达语法还不太一样,一定要引起重视。
还因为是nativeQuery,所以这里的表名,字段名需要和数据库里的一致,不像平常是和javabean保持一致。

3.遇到的一个大坑:

java.lang.IllegalArgumentException:Parameter with that position [1] did not exist
这个问题最后我发现是countQuery有问题,我一开始以为是只要把整张表的长度返回回去就好了(就像SELECT count(*) FROM USERS),但肯定不是啊!!
countQuery后面跟的where条件一定要和上面value里面的where条件一致。