Spring Data JPA如何在where子句中添加排序、分页功能?

15
3个回答

30

只需在您的存储库接口中创建一个查询方法即可。

请看文档这里

添加带有分页和where子句的查询方法。

Page<User> findByLastname(String lastname, Pageable pageable);

您可以通过“lastname”属性查找用户并配置分页设置。


1
只是提醒:在使用Oracle数据库进行排序和分页时,请记得将表的主键作为最后一个排序条件。否则,由于查询优化器中的Oracle错误,分页将会变成一团糟:https://stackoverflow.com/a/16629702/7974082 。我刚刚浪费了3个小时的时间来修复破碎的分页。 - Michał Stochmal

4

我也更喜欢使用QueryDSL。 - azerafati

0

要获取Spring Data JPA应用排序、分页和where子句检查,请查看以下代码

  1. 实体类

    @Entity
    @Table(name = "users")
    public class User{
        private String name;
        private Integer id;
        private String email;
        // 添加必要的setter和getter方法//
    }
    
  2. 仓库类

    @Repository("userRepository")
    @Transactional`
    public interface UserRepository extends JpaRepository<User, Integer>{
    
    }
    
  3. 服务层使用Example对象传递where子句,同时使用Pagable和Sort类进行分页和排序。我们将在控制器中实现Pageable以注入排序逻辑,然后将该Pagable对象传递到服务层。

    @Service
    public class UserService{
        public Page<User> getUserListPaginated(`EXAMPLE<User>` searchTerm, Pageable pageable) {
            return userRepo.findAll(searchTerm,pageable);
        }
    }
    

Example<T>如果其值为null,则不接受该属性。因此,我在实体类中使用了Integer id,因为我可以在第一次调用时将其值设置为null。

现在的控制器类
@Controller public class UserController{
@Autowired UserService userService; @GetMapping("/users") public String users(Model model,@RequestParam(value="page",defaultValue = "0") Integer pageNumber, @SortDefault(sort = "name", direction = Sort.Direction.ASC) Sort sort){ Pageable pageable = PageRequest.of(pageNumber,10, sort); Example<User> searchTerm = Example.of(new User()); Page<User> userList = userService.getUserListPaginated(searchTerm, pageable);
} }

类型 QueryByExampleExecutor<User> 中的方法 findAll(Example<S>, Pageable)对于参数(String, Pageable)不适用......我得到了这个编译错误。 - Mateen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接