SpringDataJPAのSpecificationの複雑な検索
9632 ワード
前言
前回のSpringData-JPAのExampleMatchの例クエリに続いて、ExampleMatchは日付に関する問い合わせが特に悪いので、Specificationクエリの研究ができました.
2018年8月11日:学んだことによって、文章を更新し、Pageasbleのページ順の機能を追加しました.
実現する
対応するRepositoryはJpaSpecification Exectorインターフェースを実現する必要があります.
出会うかもしれないエラー
前回のSpringData-JPAのExampleMatchの例クエリに続いて、ExampleMatchは日付に関する問い合わせが特に悪いので、Specificationクエリの研究ができました.
2018年8月11日:学んだことによって、文章を更新し、Pageasbleのページ順の機能を追加しました.
実現する
対応するRepositoryはJpaSpecification Exectorインターフェースを実現する必要があります.
public interface EventRepository extends JpaRepository<Event, Integer> , JpaSpecificationExecutor<Event>{
SpecificationとControllerの業務ロジック @GetMapping("/event/list")
public ApiReturnObject findAllEvent(String event,Timestamp registerTime,Integer pageNumber,Integer pageSize) {
if(pageNumber==null) pageNumber=1;
if(pageSize==null) pageNumber=10;
//
//Pageable ,PageRequest ,new PageRequest() ,PageRequest.of()
//PageRequest.of ,page , 0,size , Sort
Pageable pageable = PageRequest.of(pageNumber,pageSize,Sort.Direction.DESC,"id");
//Specification
Specification specification=new Specification() {
private static final long serialVersionUID = 1L;
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder criteriaBuilder) {
Predicate condition1 = null;
if(StringUtils.isNotBlank(eventTitle)) {
condition1 = criteriaBuilder.like(root.get("eventTitle"),"%"+eventTitle+"%");
}else {
condition1 = criteriaBuilder.like(root.get("eventTitle"),"%%");
}
Predicate condition2 = null;
if(registerTime!=null) {
condition2 = criteriaBuilder.greaterThan(root.get("registerTime"), registerTime);
}else {
condition2 = criteriaBuilder.greaterThan(root.get("registerTime"), new Timestamp(1514736000000L));
}
//Predicate conditionX=criteriaBuilder.and(condition1,condition2);
//query.where(conditionX);
query.where(condition1,condition2);
//query.where(getPredicates(condition1,condition2)); //
return null; // JPA API , Predicate Spring Data Jpa, return null
}
};
Page list=eventRepository.findAll(specification, pageable);
return ApiReturnUtil.page(list);
}
Apple ReturnUtil.pageパッケージ public static ApiReturnObject page(Page returnObject) {
return new ApiReturnObject(returnObject.getNumber()+"",returnObject.getNumberOfElements()+"",returnObject.getTotalElements()+"",returnObject.getTotalPages()+"","00","success",returnObject.getContent());
}
String errorCode="00";
Object errorMessage;
Object returnObject;
String pageNumber;
String pageSize;
String totalElements;
String totalPages;
public ApiReturnObject(String pageNumber,String pageSize,String totalElements,String totalPages,String errorCode, Object errorMessage, Object returnObject) {
super();
this.pageNumber = pageNumber;
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.returnObject = returnObject;
this.pageSize = pageSize;
this.totalElements = totalElements;
this.totalPages = totalPages;
}
リターンオブジェクトに有用なのは、PageNumber、PageSize、totalElements、totalPagesなどの属性で、パッケージ化が可能です.{
"errorCode": "00",
"errorMessage": "success",
"pageNumber": "1",
"pageSize": "2",
"returnObject": [
{
"eventTitle": "1111",
"id": 3,
"registerTime": 1528702813000,
"status": "0"
},
{
"eventTitle": " ",
"id": 2,
"registerTime": 1526268436000,
"status": "0"
}
],
"totalElements": "5",
"totalPages": "3"
}
調べられます.インターネットではこれに関する資料も少ないです.みんなの役に立ちますように.出会うかもしれないエラー
Unable to locate Attribute with the the given name [event] on this ManagedType [org.microservice.tcbj.yytsg.checkcentersys.entity.Event]
このような場合は、一般的に本体類にはこの属性がないため、例えば私はEventTitleで、イベントと書いたらエラーが発生します.