我正在使用带有Spring Data JPA的Spring Boot 2.0.2.RELEASE。我正在尝试在 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_idn" +
"WHERE ud.access_token IS NOT NULL AND ud.user_id <> 1n" +
"ORDER BY calculateDistanceByLatLong(:userLat, :userLong, ud.latitude, ud.longitude) ASC n#pageablen",
countQuery = "SELECT COUNT(DISTINCT u.id) FROM users u n" +
"INNER JOIN user_devices ud ON u.id = ud.user_idn" +
"WHERE ud.access_token IS NOT NULL AND ud.user_id <> 1 n#pageablen")
public Page<LocationProjection> listNearByUsers(@Param("userLat")String userLatitude,@Param("userLong") String userLongitude, Pageable pageable) throws Exception;
我从这个链接得到了参考。
并查看了此链接。
但它没有添加任何分页代码。 当我尝试使用:
userDao.listNearByUsers(userDeviceEntity.getLatitude(),userDeviceEntity.getLongitude(), PageRequest.of(pageNo, maxResults))
例如,设置页面No=0和最大结果=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 数据会在主查询中添加"LIMIT 0,1",但它不起作用。DAO 接口是:
@Repository
public interface UserDao extends JpaRepository<UserEntity, Integer>{}
请提出一些解决方案。
在这里进行了几次问答之后,没有一个正常工作(至少对于我的设置而言(。在 Spring 官方文档中阅读了这一部分后,我设法通过简单地从查询中删除"可分页"位来使其工作。
我正在使用 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);
}