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

在Spring JPA中通过分页和排序从多个表中选择

翁俊良
2023-03-14

我看到Spring Data中的从多个表中选择已经有了多个表的解决方案。我想知道是否可以在Spring JPA/Data中同时编写具有可分页和排序功能的表的自定义查询。

SELECT s.service_id, s.name, us.rating_id 
FROM services s, 
   ratings r, 
   user_services us
where 
   us.service_id = s.service_id and
   us.rating_id = r.rating_id and
   us.user_id= ?
;

提前谢谢你的帮助。

共有1个答案

莫欣悦
2023-03-14

排序功能受到质疑,但分页是可以使用的。

假设我们有:

@Entity
public class Service {

    @Id
    private Long id;

    private String name;

    //...
}

@Entity
public class UserService {

    @Id
    private Long id;

    @ManyToOne        
    User user;

    @ManyToOne        
    Service service;   

    @ManyToOne        
    Rating rating;   

    //...
}

然后我们创建一个投影:

public interface ServiceRating {
    Long getServiceId();
    String getServiceName();
    Long getRatingId();
}

然后创建一个支持分页的查询方法:

public interface UserServiceRepo extends CrudRepository<UserService, Long> {
    @Query("select s.id as serviceId, s.name as serviceName, us.rating.id as ratingId from UserService us join us.service s where us.user.id = ?1")
    Page<ServiceRating> getServiceRating(Long userId, Pageable pageable);
}
Page<ServiceRating> pages = userServiceRepo.getServiceRating(1L, new PageRequest(0, 10));
assertThat(pages.getContent()).hasSize(10));
Sort sort = new Sort(Sort.Direction.ASC, "serviceName");
userServiceRepo.getServiceRating(1L, new PageRequest(0, 10, sort));
 类似资料:
  • 分页 使用 limit 和 offset 来控制分页数据: limit 指定该请求返回的结果个数 offset 偏移量,指定该请求返回的结果的起始位置 默认 limit 为 20, offset 为 0,我们也可以手动指定 limit 和 offset 来控制。例如,每页展示 100 条数据,需要获取第五页的数据,将 limit 设置为 100、offset 设置为 400 即可。limit 最大

  • {% tabs first=”SDK 1.1.0 及以上版本”, second=”SDK 1.1.0 以下版本” %} {% content “first” %} SDK 1.1.0 及以上版本 分页 使用 limit 和 offset 来控制分页数据: limit 指定该请求返回的结果个数 offset 偏移量,指定该请求返回的结果的起始位置 默认 limit 为 20, offset 为 0,

  • 问题内容: 我想根据URL字符串选择一些ID,但对于我的代码,它仅显示第一个。如果我写手册的ID是伟大的。 我有这样的网址http://www.mydomain.com/myfile.php?theurl=1,2,3,4,5(ids) 现在在myfile.php中,我有sql连接,并且: 如果我使用这个: 我得到正确的结果。现在,如果我使用下面的代码,它将无法正常工作: 有什么建议? 问题答案:

  • 问题内容: 我完全为在mysql中从rank()over(按x分区,按y desc排序)创建新列“ LoginRank”而感到困惑。 从SQL Server,我将编写以下查询,以创建按“登录”分组并按“ id”排序的“ Loginrank”列。 我有下表。 我尝试将许多现有的mysql修复程序应用到我的数据集,但仍然存在问题。 任何帮助是极大的赞赏。谢谢! 问题答案: 请尝试以下查询:-MySql

  • 我是javascript新手,我有一个问题暂时无法解决……我需要对表进行动态排序。(借用)代码为: 它适用于文本/数字值,但问题是表中的一列由复选框组成。这个想法是按照带有选中复选框的行在顶部的方式对表格进行排序(/底部,取决于升序/降序方向)。 我试图检查< code > x . innerhtml . checked = = true ,但是< code>x.innerHTML.checked

  • 问题内容: 我试图从sqlite的单个操作中删除多个表。我尝试用分号分隔它,但没有按预期进行。这是我当前的代码: 我需要一些指导,以解决问题可能出在哪里,或者如果我缺少什么。 问题答案: 要使用多个语句进行原子操作,请使用事务: 如果使用sqlite3_prepare_v2,则必须一个接一个地执行这五个命令。使用sqlite3_exec,您可以一次调用执行它们(但不支持SQL参数)。