spring data jpa的查询
目前比较简单的查询:
三种查询方案的写法
- 固定参数查询
interface XxxRepo implements JpaRepository<T,Long>{
EntityXxx findByNameAndSex(String name,String sex);
}
这种方式是简单的,方法名表达自己想查询的方法。支持and, or ,like, top, betweent,order等等。
- 不定参数个数查询
PageRequest pageable = new PageRequest(query.getPindex(), query.getPcount(), query.getSortObj());//分页
Example<EntityXXX> example = Example.of(entity, ExampleMatcher.matchingAll());//封装对象,matchingAll表明满足所有条件
Page<EntityXXX> findAll = entityRepo.findAll(example, pageable);//开始查找并返回对象
像以上这种代码,是可以多条件and查询的。比如name=abc and sex=male。这种组合满足我们一般的需求。
但是如果,我们想要查找name in (zhangsan,lisi,wanger,mazi)等,那么这种方式就不再适用。我们可以采用高级一点的查询。
- 高级组合查询:
public Page<EntityXxx> findAll(EntityXxx entity, PageRequest pageable) {
Specification<EntityXxx> condition = whereCondition(entity);
Page<EntityXxx> page = entityRepo.findAll(condition, pageable);
return page;
}
private Specification<EntityXxx> whereCondition(EntityXxx entity) {
return new Specification<EntityXxx>() {
@Override
public Predicate toPredicate(Root<EntityXxx> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
List<String> names = new ArrayList<>();
names.add("zhangsan");
names.add("lisi");
names.add("wanger");
Expression<Long> parentExpression = root.get("name");
Predicate parentPredicate = parentExpression.in(names);
predicates.add(parentPredicate);
if (!StringUtils.isEmpty(entity.getSex())) {
predicates.add(cb.like(root.<String>get("sex"), "%" + entity.getSex() + "%"));//like查询
}
if (null != entity.getIdnum()) {
predicates.add(cb.equal(root.<Integer>get("innum"), entity.getIdnum()