springboot集成spring data jpa使用JpaRepository中的api分页与排序(gradle)

版本环境

java:jdk-14.0.1
springboot:v2.3.4.RELEASE
gradle:gradle-6.7-rc-4
IntelliJ IDEA:2020.1.2
spring-boot-starter-data-jpa:v2.3.4.RELEASE

实体类

@NoArgsConstructor
@ApiModel(value = "用户实体", description = "用户实体类")
@Data
@Table(name = "user")
@Entity
public class User implements Serializable {

    private static final long serialVersionUID =  4728506793752030545L;

    @ApiModelProperty(value = "用户名")
    @Column(name = "name" )
    private String name;

    @JsonIgnore
    @ApiModelProperty(value = "用户密码")
    @Column(name = "pass" )
    private String pass;

    @ApiModelProperty(value = "用户年龄")
    @Column(name = "age" )
    private Integer age;

    @Column(name = "email" )
    @ApiModelProperty(value = "用户邮件")
    private String email;

    @ApiModelProperty(value = "用户id")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id" )
    private Integer id ;
}

数据库

create table mytest.user
(
    id    int auto_increment
        primary key,
    name  varchar(30) not null,
    pass  varchar(30) not null,
    age   int         null,
    email varchar(30) null,
    constraint user_name_uindex
        unique (name)
);

Repository

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

}

分页查询

service

在UserService中添加下面的方法

Page<User> find(Integer page, Integer size);

并在UserServiceImpl中进行实现

@Autowired
UserRepository userRepository;
@Override
public Page<User> find(Integer page, Integer size) {
    PageRequest pageable = PageRequest.of(page, size);
    Page<User> users = userRepository.findAll(pageable);
    return users;
}

其中page是页面 从0开始,size是分页大小。建议在调用该方法时,page和size进行校验

调用测试

 @Autowired
    UserService userService;
    @Test
    public void contextLoads() {
//        for (int i = 0; i < 50; i++) {
//            String name="lzc"+i;
//            userRepository.addUserByName(name, "123", 123, "aksjlaklsdf");
//        }
        var list0=userService.find(0,5);
        list0.forEach(System.out::println);
        System.out.println();
        var list1=userService.find(1,5);
        list1.forEach(System.out::println);
        System.out.println();
        var list2=userService.find(2,5);
        list2.forEach(System.out::println);
        System.out.println();
        var list3=userService.find(3,5);
        list3.forEach(System.out::println);
    }

输出结果

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.pass as pass5_0_ from user user0_ limit ?
Hibernate: select count(user0_.id) as col_0_0_ from user user0_
User(name=lxj, pass=123, age=21, email=jksdf, id=2)
User(name=dk, pass=123, age=22, email=asflh, id=3)
User(name=tzy, pass=321, age=23, email=ksdja, id=4)
User(name=jinx, pass=123, age=123, email=aksjlaklsdf, id=5)
User(name=jinx1, pass=123, age=123, email=aksjlaklsdf, id=7)

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.pass as pass5_0_ from user user0_ limit ?, ?
Hibernate: select count(user0_.id) as col_0_0_ from user user0_
User(name=jinx2, pass=123, age=123, email=aksjlaklsdf, id=9)
User(name=jinx3, pass=123, age=123, email=aksjlaklsdf, id=10)
User(name=lzc, pass=960929, age=123, email=aksjlaklsdf, id=11)
User(name=lzc0, pass=123, age=123, email=aksjlaklsdf, id=12)
User(name=lzc1, pass=123, age=123, email=aksjlaklsdf, id=13)

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.pass as pass5_0_ from user user0_ limit ?, ?
Hibernate: select count(user0_.id) as col_0_0_ from user user0_
User(name=lzc2, pass=123, age=123, email=aksjlaklsdf, id=14)
User(name=lzc3, pass=123, age=123, email=aksjlaklsdf, id=15)
User(name=lzc4, pass=123, age=123, email=aksjlaklsdf, id=16)
User(name=lzc5, pass=123, age=123, email=aksjlaklsdf, id=17)
User(name=lzc6, pass=123, age=123, email=aksjlaklsdf, id=18)

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.pass as pass5_0_ from user user0_ limit ?, ?
Hibernate: select count(user0_.id) as col_0_0_ from user user0_
User(name=lzc7, pass=123, age=123, email=aksjlaklsdf, id=19)
User(name=lzc8, pass=123, age=123, email=aksjlaklsdf, id=20)
User(name=lzc9, pass=123, age=123, email=aksjlaklsdf, id=21)
User(name=lzc10, pass=123, age=123, email=aksjlaklsdf, id=22)
User(name=lzc11, pass=123, age=123, email=aksjlaklsdf, id=23)

排序

JpaRepository中的api

/*
 * (non-Javadoc)
 * @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort)
 */
@Override
List<T> findAll(Sort sort);

注:若findAll不填参数,可调用List findAll(); 返回结果为数据表中的所有数据

遇到的坑

在springboot2.2.1(含)以上的版本Sort已经不能再实例化了,构造方法已经是私有的了!

以按年龄降序查询所有用户信息

原调用写法为:

//先定义 Order规则
//Direction.DESC 表示倒序
//"age" 表示对id 进行倒序排序
Sort.Order order = new Sort.Order(Sort.Direction.DESC, "age");
Sort sort = new Sort(order);//本行Sort构造方法报错
var allUsersSort=userRepository.findAll(sort);
allUsersSort.forEach(System.out::println);

新写法为:

var allUsersSort=userRepository.findAll(Sort.by(Sort.Direction.DESC,"age"));
allUsersSort.forEach(System.out::println);

运行结果:

//结果上部省略,一下是返回结果的最后,可以看见输出顺序已按age降序排列
User(name=lzc39, pass=123, age=123, email=aksjlaklsdf, id=51)
User(name=lzc40, pass=123, age=123, email=aksjlaklsdf, id=52)
User(name=lzc41, pass=123, age=123, email=aksjlaklsdf, id=53)
User(name=tzy, pass=321, age=23, email=ksdja, id=4)
User(name=dk, pass=123, age=22, email=asflh, id=3)
User(name=lxj, pass=123, age=21, email=jksdf, id=2)
User(name=lzc19, pass=123, age=5, email=aksjlaklsdf, id=31)
User(name=lzc17, pass=123, age=4, email=aksjlaklsdf, id=29)
User(name=lzc10, pass=123, age=3, email=aksjlaklsdf, id=22)
User(name=lzc, pass=960929, age=2, email=aksjlaklsdf, id=11)
User(name=lzc2, pass=123, age=1, email=aksjlaklsdf, id=14)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值