【问题标题】:Spring Data Native query pagination not workingSpring Data Native 查询分页不起作用
【发布时间】:2018-11-25 01:23:32
【问题描述】:

我正在使用 Spring Boot 2.0.2.RELEASE 和 Spring Data JPA。我正在尝试在 MySql 中使用本机查询实现分页,我的代码是:

@Query(nativeQuery=true, value = "SELECT DISTINCT ud.latitude,ud.longitude,u.user_id userId FROM users u \n" +
            "INNER JOIN user_devices ud ON u.id = ud.user_id\n" +
            "WHERE ud.access_token IS NOT NULL AND ud.user_id <> 1\n" +
            "ORDER BY calculateDistanceByLatLong(:userLat, :userLong, ud.latitude, ud.longitude) ASC \n#pageable\n",
            countQuery = "SELECT COUNT(DISTINCT u.id) FROM users u \n" +
                    "INNER JOIN user_devices ud ON u.id = ud.user_id\n" +
            "WHERE ud.access_token IS NOT NULL AND ud.user_id <> 1 \n#pageable\n")
    public Page<LocationProjection> listNearByUsers(@Param("userLat")String userLatitude,@Param("userLong") String userLongitude, Pageable pageable) throws Exception;

我从this link.得到了参考

还评论了this link.

但它没有添加任何分页代码。 当我尝试使用时:

userDao.listNearByUsers(userDeviceEntity.getLatitude(),userDeviceEntity.getLongitude(), PageRequest.of(pageNo, maxResults))

例如设置 pageNo=0 和 maxResults =1,所有结果都显示出来。所以没有实施分页。 我打印了触发的查询,它是:

SELECT
DISTINCT ud.latitude,
ud.longitude,
u.user_id userId 
FROM
users u  
INNER JOIN
user_devices ud 
ON u.id = ud.user_id 
WHERE
ud.access_token IS NOT NULL 
AND ud.user_id <> 1 
ORDER BY
calculateDistanceByLatLong(?,
?,
ud.latitude,
ud.longitude) ASC  #pageable

计数查询为:

SELECT
COUNT(DISTINCT u.id) 
FROM
users u  
INNER JOIN
user_devices ud 
ON u.id = ud.user_id 
WHERE
ud.access_token IS NOT NULL 
AND ud.user_id <> 1  #pageable 

我认为 Spring Data 会在主查询中添加“LIMIT 0,1”,但它不起作用。 DAO 接口是:

@Repository
public interface UserDao extends JpaRepository<UserEntity, Integer>{}

请提出一些解决方案。

【问题讨论】:

  • 您正在使用本机查询,但您的查询中没有将应用分页的 rownum。为此使用 JPQL 和 countQuery
  • @MountainKing 我遵循了我提到的参考链接。没有这样的事情。你能详细说明一下吗?
  • 有这方面的消息吗?我也遇到了同样的问题!

标签: java mysql spring-boot spring-data native-sql


【解决方案1】:

在这里查看了几个 Q/A 后,没有一个可以正常工作(至少对于我的设置而言)。在 Spring 官方文档中阅读了 bit 之后,我只需从查询中删除“可分页”位即可使其正常工作。

我正在使用 spring-boot 版本 2.0.1.RELEASE。

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2014-02-28
    • 2015-03-20
    相关资源
    最近更新 更多