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中了
推荐阅读: