当前位置: 首页 > 知识库问答 >
问题:

Spring Data Native查询分页不工作

冯良才
2023-03-14

我使用的是Spring Boot 2.0.2。使用Spring数据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;

我从这个链接得到了参考。

并且还回顾了这个环节。

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

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

例如设置pageNo=0和max结果=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>{}

请提出一些解决方案。

共有1个答案

桑飞语
2023-03-14

在这里看了几个问答之后,没有一个正常工作(至少对于我的设置来说)。在Spring官方留档中阅读了这一点后,我通过简单地从查询中删除“可分页”位来设法让它工作。

我正在使用spring boot版本2.0.1。释放。

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);
}
 类似资料:
  • 使用数据库的应用程序,多数情况下都需要使用 “分页” 这个功能。尤其是在 Web 应用程序中,后端的分页查询尤其的普遍。 在以往的使用经验中,一个分页查询,除了能获取到一个列表外,我们通常需要如下几个信息才能在客户端显示出一个完整的翻页条。 当前页数 -- 第几页 页大小 -- 每页有多少条记录 总页数 -- 一共多少页 总记录数 -- 如果不分页,一共有多少条记录 当我们获得了这四条信息后,对于

  • limt 分页查询 查询前3条记录 分页公式: (offset - 1) * limit SELECT name FROM `student` LIMIT 0, 3; Student.findAll( { attributes:['name'], // 当前页 offset:0, // 每页显示的条数 limit:3 }) 分页案例 router.ge

  • 在使用 hyperf/database 来查询数据时,可以很方便的通过与 hyperf/paginator 组件配合便捷地对查询结果进行分页。 使用方法 在您通过 查询构造器 或 模型 查询数据时,可以通过 paginate 方法来处理分页,该方法会自动根据用户正在查看的页面来设置限制和偏移量,默认情况下,通过当前 HTTP 请求所带的 page 参数的值来检测当前的页数: 由于 Hyperf 当

  • 问题内容: 因此,我想在Oracle数据库中选择一系列行。我需要这样做是因为表中有数百万行,并且我想将结果分页给用户(如果您知道另一种在客户端执行此操作的方法,那么我正在使用JavaFX,但我没有认为通过网络发送所有数据以在客户端对它们进行分页是个好主意)。 我有以下查询: 该和只是例子。在应用程序中,我只是要求下限并添加10_000的大小以获取接下来的10_000行。 现在rownum列出现在结

  • 所以我想在Oracle DB中选择一系列行。我需要这样做,因为我在表中有数百万行,我想将结果分页给用户(如果您知道在客户端执行此操作的另一种方法,如果重要的话,我正在使用JavaFX,但我认为通过网络发送所有数据以在客户端分页它们不是一个好主意)。 所以读完这篇文章:SQLROWNUM如何在特定范围之间返回行,我有以下疑问: 和就是一个例子。在应用程序中,我只需要求下限,然后添加一个10\u 00

  • sp_sql_posts($tag,$where) 功能: 查询文章列表,不做分页 参数: $tag:查询语句(见$tag规则) $where:查询条件,(暂只支持数组),格式和thinkphp where方法一样; 返回: array 文章列表 示例: <?php $tag='cid:6;field:post_title,post_content;order:listorder asc'; $