[英]Getting results for only partial inputs for queries using Spring Boot Hibernate Criteria API PostGRES
我在使用傳遞給 REST 端點的完整字符串值檢索結果時遇到問題。
如果我為值“communityNo”傳遞完整的 6 個字符串,我會得到一個空的 Json 數組。 如果我為 communityNo 傳遞前 6 個字符中的 1-3 個,那么我會返回大量記錄。
REST endpt url: http://localhost:8080/web-portal/api/aw501?stateId=2&community
標准 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
}
} ;
}
}
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> {
}
@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
}
@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.