繁体   English   中英

使用 Spring 引导 Hibernate 标准 API PostGRES 仅获取查询的部分输入的结果

[英]Getting results for only partial inputs for queries using Spring Boot Hibernate Criteria API PostGRES

我在使用传递给 REST 端点的完整字符串值检索结果时遇到问题。

如果我为值“communityNo”传递完整的 6 个字符串,我会得到一个空的 Json 数组。 如果我为 communityNo 传递前 6 个字符中的 1-3 个,那么我会返回大量记录。

  1. REST endpt url: http://localhost:8080/web-portal/api/aw501?stateId=2&community

  2. 标准 api 规格

public static Specification<Aw501> findAllByStateId(String stateId){
       return new Specification <Aw501>(){
           public Predicate toPredicate(Root<Aw501> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
               return cb.like(root.get(Aw501_.stateId),   stateId + "%"); //MDB
           }

       } ;
   }


   public static Specification<Aw501> findAllByCommunityNo(String communityNo){
       return new Specification <Aw501>(){
           public Predicate toPredicate(Root<Aw501> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
               return cb.like(root.get(Aw501_.communityNo),  communityNo + "%"); //MDB
           }       

       } ;
   }

}
  1. 存储库接口
package pivot.fema.dhs.gov.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import pivot.fema.dhs.gov.domain.report.Aw501;
import java.util.List;

/**
 * Spring Data JPA repository for the Claims entity.
 */
@Repository
public interface Aw501Repository
        extends JpaRepository<Aw501, Long>, JpaSpecificationExecutor<Aw501> {
}

  1. 服务 class
@Service
@Transactional
public class Aw501Service {

    private final Logger log = LoggerFactory.getLogger(Aw501Service.class);


    private final Aw501Repository aw501Repository;

    private final CacheManager cacheManager;

    private ReportSessionParameters reportSessionParameters;


    @Inject
    private ApplicationProperties applicationProperties;

    private ApplicationProperties.Performance performance;


    public Aw501Service(Aw501Repository aw501Repository,
                        CacheManager cacheManager){
                            this.aw501Repository = aw501Repository;
                            this.cacheManager = cacheManager;
    }



    @Transactional(readOnly = true)
    public Page<Aw501DTO>  getAw501Reports(Integer pageNumber, 
                                           Integer pageSize, 
                                           String  sortBy, 
                                           String  sortOrder,
                                           String stateId, 
                                           String communityNo){

        boolean flagStateId = StringUtils.isNotBlank(stateId) ;
        boolean flagCommunityNo = StringUtils.isNotBlank(communityNo) ;


        if(flagStateId){
            log.info("****Aw501Service.java  flag input for flagStateId :" +  true + "****");
        }else{

        }


        if(flagCommunityNo){
            log.info("****Aw501Service.java  flag input for flagCommunityNo :" +  true + "****");
        }else{

        }




        Specifications<Aw501> predicates = null ;




       if(flagStateId && flagCommunityNo){
            predicates =  Specifications.where(Aw501Spec.findAllByStateId(stateId)) ;
            predicates = predicates.and(Specifications.where(Aw501Spec.findAllByCommunityNo(communityNo)));
        }

        if( flagStateId && flagCommunityNo){
            if(flagStateId){
                log.info("****Aw501Service.java  (flagStateId && flagCommunityNo):" +  true + "****  predicates = " + predicates.toString());
            }else{

            }
        }




        if(flagStateId && !flagCommunityNo){
            predicates =  Specifications.where(Aw501Spec.findAllByStateId(stateId)) ;
        }

        if(flagStateId && !flagCommunityNo){
            log.info("****Aw501Service.java  (flagStateId && !flagCommunityNo):" +  true + "****  predicates = " + predicates.toString());
        }else{

        }


        if( !flagStateId && flagCommunityNo){
            predicates = Specifications.where(Aw501Spec.findAllByCommunityNo(communityNo)) ;
        }

        if(!flagStateId && flagCommunityNo ){
            log.info("****Aw501Service.java  (!flagStateId && flagCommunityNo):" +  true + "****  predicates = " + predicates.toString());
        }else{

        }

        PageRequest pageRequest = new PageRequest(1,25);

        if(pageRequest  != null ){
            log.info("****Aw501Service.java  (pageRequest): pageRequest is not null"  + "****  pageNumber = " +  pageRequest.toString() + " pageOffset : " + "" );
        }else{
            log.info("****Aw501Service.java  (pageRequest): pageRequest is  null"  + "****  " );
        }

        Page<Aw501DTO> foobar = aw501Repository
                .findAll(predicates,pageRequest)
                .map(Aw501DTO::new);


        if(foobar  != null ){
            log.info("****Aw501Service.java  (foobar): foobaris not null"  + "****  foobar = " +  foobar.hasContent() +  " pageOffset : " + "" );
        }else{
                log.info("****Aw501Service.java  (foobar): pageRequest is  null"  + "****  " );
        }

        return foobar ;
    }//end getAw501Reports

}
  1. 休息控制器 class:
@RestController
@RequestMapping("/api")
public class Aw501Resource{


    Page<Aw501DTO> page = new PageImpl<Aw501DTO>(Collections.<Aw501DTO>emptyList());

    private final Logger log = LoggerFactory.getLogger(Aw501Resource.class);

    private final Aw501Repository aw501Repository;

    private final Aw501Service aw501Service;

    private final ReportSessionParameters reportSessionParameters;



    public Aw501Resource(Aw501Repository aw501Repository,
                         Aw501Service aw501Service,
                         ReportSessionParameters reportSessionParameters) {

        this.aw501Repository = aw501Repository;
        this.aw501Service = aw501Service;
        this.reportSessionParameters = reportSessionParameters;
    }


    /*
        A page is a sublist of a list of objects.  It allows  gain 
        information about the about the posistion of it in 
        th e containing entire list. 
    */

    @GetMapping("/aw501")

    public  Page<Aw501DTO> getAw501(@RequestParam(name = "stateId", required = false) String stateId,
    @RequestParam(name = "communityNo", required = false) String communityNo,
    @RequestParam(name = "sortBy", required = false) String sortBy,
    @RequestParam(name = "sortOrder", required = false) String sortOrder,
    @RequestParam(name = "pageSize", required = false) Integer pageSize,
    @RequestParam(name = "pageNumber", required = false) Integer pageNumber){


        if (StringUtils.isNotBlank(stateId)){
            log.info("****Aw501Resource.java  input for stateId :" +  stateId  + "****");
            stateId = stateId.trim() ;
        }

        if (StringUtils.isNotBlank(communityNo)){
            log.info("****Aw501Resource.java  input for communityNo :" +  communityNo  + "****");
            communityNo = communityNo.trim() ;
        }


        if (StringUtils.isNotBlank(sortBy)){
            log.info("****Aw501Resource.java  input for sortBy :" +  sortBy  + "****");
            sortBy =  sortBy.trim() ;
        }

        if (StringUtils.isNotBlank(sortOrder)){
            log.info("****Aw501Resource.java  input for sortOrder :" +  sortOrder  + "****");
            sortOrder =  sortOrder.trim() ;
        }



        if (pageNumber != null && pageNumber.compareTo(0) > 0){
            log.info("****Aw501Resource.java  input for pageNumber :" +  pageNumber.toString()  + "****");
            pageNumber-- ;
            log.info("****Aw501Resource.java  input for pageNumber-- :" +  pageNumber.toString()  + "****");
        }

        return aw501Service.getAw501Reports(pageNumber, pageSize, sortBy, sortOrder, stateId,communityNo);
    }

    @GetMapping("/foobar")
    public Map<String,String> foobar(@RequestParam(name = "stateId", required = false) String stateId,
    @RequestParam(name = "communityNo", required = false) String communityNo,
    @RequestParam(name = "sortBy", required = false) String sortBy,
    @RequestParam(name = "sortOrder", required = false) String sortOrder,
    @RequestParam(name = "pageSize", required = false) Integer pageSize,
    @RequestParam(name = "pageNumber", required = false) Integer pageNumber){
        Map<String , String> map = new HashMap<String,String>() ;
        map.put("stateId","51") ;
        map.put("sortBy","DESC");
        map.put("pageSize","25");
        map.put("pageNumber","100");
        return map ;
    }


}

你们能提供的任何帮助将不胜感激!!!! 谢谢!!!

问题出在 Aw501Service.java

    PageRequest pageRequest = new PageRequest(1,25);

为什么我得到的结果只有部分输入与标准代码中的谓词通配符匹配,而当输入完全匹配时却没有; 是 PageRequest object 在内部使用数组来存储检索到的对象。 如果只返回一个 object...正如我的应用程序上下文中的完全匹配所预期的那样...那么访问索引 [1] 处的该数组自然会返回“无”。 我通过对上述代码行的简单修改来纠正这个问题:

    PageRequest pageRequest = new PageRequest(0,25);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM