[英]Getting results for only partial inputs for queries using Spring Boot Hibernate Criteria API PostGRES
I am having a problem with retrieving results using the full value of strings being passed to a REST endpoint.我在使用传递给 REST 端点的完整字符串值检索结果时遇到问题。
If I pass the full 6 character string for the value "communityNo", I get an empty Json array back.如果我为值“communityNo”传递完整的 6 个字符串,我会得到一个空的 Json 数组。 If I pass 1-3 of the first 6 characters for communityNo, then I get tons of records back.
如果我为 communityNo 传递前 6 个字符中的 1-3 个,那么我会返回大量记录。
REST endpt url: http://localhost:8080/web-portal/api/aw501?stateId=2&communityNo=200 REST endpt url: http://localhost:8080/web-portal/api/aw501?stateId=2&community
criteria api specifications标准 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 ;
}
}
Any help you guys could provide would be extremely appreciated!!!!你们能提供的任何帮助将不胜感激!!!! Thanks!!!
谢谢!!!
The problem was in Aw501Service.java问题出在 Aw501Service.java
PageRequest pageRequest = new PageRequest(1,25);
The reason why I was getting results with only partial inputs that matched the predicate wild card in the criteria code but nothing when the input was an exact match;为什么我得到的结果只有部分输入与标准代码中的谓词通配符匹配,而当输入完全匹配时却没有; was that the PageRequest object uses an array internally to store retrieved objects.
是 PageRequest object 在内部使用数组来存储检索到的对象。 If there is only one object returned...as would be expected from an exact match within the context of my application....then accessing that array at index [1] will naturally return "nothing".
如果只返回一个 object...正如我的应用程序上下文中的完全匹配所预期的那样...那么访问索引 [1] 处的该数组自然会返回“无”。 I correct the issue via the simple modification to the aforementioned line of code to:
我通过对上述代码行的简单修改来纠正这个问题:
PageRequest pageRequest = new PageRequest(0,25);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.