不属于Repository体系,实现一组 JPA Criteria 查询相关的方法
image.png
Specification:封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象
Repository
public interface CityRepository extends JpaRepository<City,Integer>,CityDao,JpaSpecificationExecutor<City>,QueryDslPredicateExecutor<City> {
}
Service
package club.javalearn.learn.springdata.extend.service;
import club.javalearn.learn.springdata.extend.domain.City;
import org.springframework.data.domain.Page;
import java.util.List;
public interface CityService {
void test(String userName);
Page<City> getPageList();
List<City> getList();
List<City> getList2();
}
Service实现类
package club.javalearn.learn.springdata.extend.service;
import club.javalearn.learn.springdata.extend.domain.City;
import club.javalearn.learn.springdata.extend.domain.QCity;
import club.javalearn.learn.springdata.extend.repository.CityRepository;
import com.querydsl.core.types.Predicate;
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.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import java.util.List;
@Service
public class CityServiceImpl implements CityService {
@Autowired
private CityRepository cityRepository;
public void test(String userName) {
QCity qCity = QCity.city;
Predicate predicate = qCity.name.eq(userName).and(qCity.id.gt(100));
cityRepository.findAll(predicate);
}
@Override
public List<City> getList2() {
Pageable pageable = new PageRequest(1,10);
Page<City> page = cityRepository.findAll(new Specification<City>(){
@Override
public javax.persistence.criteria.Predicate toPredicate(Root<City> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Path<String> namePath = root.get(“name”);
Path<String> countryPath = root.get(“country”);
//这里可以设置任意条查询条件
query.where(cb.like(namePath, “%李%”), cb.like(countryPath, “%武汉%”));
//这种方式使用JPA的API设置了查询条件,所以不需要再返回查询条件Predicate给Spring Data Jpa,故最后return null;即可。
return null;
}
},pageable);
return page.getContent();
}
}