JPA的动态查询和分页

时间:2022-5-27    作者:老大夫    分类: JAVA


JPA想要实现动态查询需要用到specifications,他可以添加条件,还可以添加分页Page

要在Repository中多继承一个JpaSpecificationExecutor < E >

public interface IllegalRecordRepository extends EPagingAndSortingRepository<IllegalRecord,Integer>
    , JpaSpecificationExecutor<IllegalRecord> {

    @Override
    List<IllegalRecord> findAll();

    @Query("FROM IllegalRecord where carBand like concat('%',?1,'%')")
    List<IllegalRecord> findByCondition(String carBand);
}

构建pagebale的方式

@SpringBootTest
class Carwork1ApplicationTests {

    @Autowired
    IllegalRecordRepository recordRepository;

    @Test
    public void findByCondition() {
        //构建pageble
        PageRequest pageRequest = PageRequest.of(0, 2);
        //查找的时候传入pageble获取page
        Page<IllegalRecord> page=recordRepository.findAll(pageRequest);

        System.out.println(page);

    }
}

构建toPredicate

@Service
public class IllegalRecordServiceImpl implements IllegalRecordService {
    @Autowired
    IllegalRecordRepository recordRepository;

    @Override
    public Page<IllegalRecord> findByCondition(String carBand, Integer pageNo, Integer pageSize) {

        System.out.println(carBand);
        System.out.println(pageNo);
        System.out.println(pageSize);

        PageRequest pageRequest = PageRequest.of(pageNo, pageSize);

        Page<IllegalRecord> page=recordRepository.findAll(new Specification<IllegalRecord>() {
            @Override
            public Predicate toPredicate(Root<IllegalRecord> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                //root from IllegalRecord,获取列
                //CriteriaBuilder where 用来设计条件
                //query 组合(order by ,where)

                //这里的path设置成属性对应的类型
                Path<String> carBand1 = root.get("carBand");

                //1.通过root拿到条件字段
                //参数1 :为哪个字段设置条件
                //参数2 :值

                //2.设置不同类型条件
                Predicate like = criteriaBuilder.like(carBand1, "%"+carBand+"%");

                //不同条件可以用 criteriaBuilder.and()
                //不同条件可以用 criteriaBuilder.or()  连接

                //criteriaBuilder.in(一个属性名)  生成in 之后in.value().value()使用
                //生成的对象也是 Predicate类型对象

                //3.返回Predicate类型对象
                return like;
            }
        },pageRequest);

        return page;
    }

更多操作可以看:https://www.bilibili.com/video/BV13Y411x7n9?p=19

到这里返回一个page就可以用了
我是将条件查询塞入到serviceimpli中了


扫描二维码,在手机上阅读

推荐阅读: