Spring data JPA 的分页功能及复杂语句查询(修改第二次)

测试的数据表

 

import com.example.demo.entity.DemoUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface DemoUserRepository extends JpaRepository<DemoUser,Integer>,JpaSpecificationExecutor<DemoUser> {

}
import com.example.demo.entity.DemoUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.*;

@Service
public class JPAService {

    @Autowired
    DemoUserRepository demoUserRepository;

    public Page<DemoUser> pageFindAll(int page ,int size){
        Sort sort = new Sort(Sort.Direction.DESC, "id");        //根据id降序排序
        Pageable pageable = PageRequest.of(page, size, sort);   //page当前页,size一页大小
        Page<DemoUser> demoUserPage = demoUserRepository.findAll(pageable);
        return demoUserPage;
    }

}

测试代码

    @Test
    public void jpat(){
        Page<DemoUser> demoUserPage = jpaService.pageFindAll(0,2);
        System.out.println("总记录数:"+demoUserPage.getTotalElements());
        System.out.println("总页数:"+demoUserPage.getTotalPages());
        System.out.println("一页有多少记录:"+demoUserPage.getSize());
        System.out.println("当前页数:"+demoUserPage.getNumber());
        System.out.println("记录:"+demoUserPage.getContent());
    }

上面这个pageFindAll()方法运行结果

page在 pageFindAll() 是一个参数,表示当前页索引,但是在计算sql语句的limit需要开始和结束位置时是 page * size 和 (page+1) * size,才能得到我们需要那一页的数据,所以这里面我们传入的page都是从0开始,在得出结果或者到达前端时再加1就好了。

Repository继承JpaSpecificationExecutor可以构建复杂的查询语句

/**
     * 使用JPA分页功能并有条件查询,单个条件
     * 模糊查询所有记录username like %字符%,降序id排序
     * 分页,一页2条记录
     */
    public Page<User> findByUsernameLike(String username) {
        Specification<User> specification = new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Path<String> _username = root.get("username");
                Predicate _key = criteriaBuilder.like(_username, "%" + username + "%");
                return criteriaBuilder.and(_key);
            }
        };
        Sort sort = new Sort(Sort.Direction.DESC, "id");
        Pageable pageable = PageRequest.of(0, 2, sort);
        Page<User> demoPage = userRepository.findAll(specification, pageable);
        return demoPage;
    }

toPredicate()方法在生成SQL语句时会添加  类似 “ where username like ? ” 的条件,可能 ‘ username ’ 会发生变化,因为hibernate在生成SQL语句时会为表生成别名。

测试代码

@Test
public void jpat2(){
    Page<DemoUser> demoUserPage = jpaService.findByUsernameLike("11");
    System.out.println("总记录数:"+demoUserPage.getTotalElements());
    System.out.println("总页数:"+demoUserPage.getTotalPages());
    System.out.println("一页有多少记录:"+demoUserPage.getSize());
    System.out.println("当前页数:"+demoUserPage.getNumber());
    System.out.println("记录:"+demoUserPage.getContent());
}

运行结果

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值