使用Spring數據jpa和規範,我有要求在spring mvc中實現過濾/搜索功能。後端接收一個對象(ReportTemplateBean),它基本上是一個bean,其中一些字段代表前端的過濾器。Spring Data JPA中的動態查詢。重構
public class ReportTemplateBean implements Serializable {
private static final long serialVersionUID = -3915391620260021813L;
private Long id;
private String property;
private String city;
private String state;
private String zipCode;
private String propertyStatus;
private String realEstateRep;
//more code
我們有控制器
@RequestMapping(value = "/search", method = RequestMethod.GET)
@ResponseBody
public ReportBean search(@AuthenticationPrincipal ActiveUser activeUser,
@ModelAttribute("templateForm") ReportTemplateBean template,
Pageable pageable) throws GenericException {
LOGGER.info("Pulling report requested");
ReportBean report = reportService.searchProperties(template,
pageable.getPageNumber(), pageable.getPageSize());
return report;
}
服務
@Override
@Transactional(readOnly = true, timeout = 20)
public ReportBean searchProperties(ReportTemplateBean template,
Integer pageNumber, Integer pageSize) throws GenericException,
TransactionTimedOutException {
LOGGER.info("searchProperties({})", template);
try {
// pageNumber = (pageNumber == null ? 0 : pageNumber);
// pageSize = (pageSize == null ? 10 : pageSize);
ReportTemplate t = reportTemplateMapper.beanToEntity(template);
List<PropertyBean> beans = new ArrayList<PropertyBean>();
PropertySpecification spec = new PropertySpecification(t);
Page<Property> properties = propertyRepository.findAll(spec,
new PageRequest(pageNumber, pageSize, Sort.Direction.ASC,
"name"));
然後它動態地建立查詢,但使用長IF鏈,我不喜歡它。這是規範。你可以注意到規格看起來很難看,而且SONAR抱怨這種方法的圓環複雜性(這很好)。
所以問題是,我如何重構規範(IF的)更面向對象的代碼? 在此先感謝。我想使用/實現像Spring Data JPA中的新特性(Query by Example)似乎如果你通過一個bean ExampleMatcher類將忽略bean字段中的空值,這幾乎是什麼我在尋找。忽略空值和空值。
你想一個解決方案僅使用規範?我有一個類似的問題,但我解決它寫的查詢與@Query標註使用可選參數在我的倉庫 – amicoderozer
會很好,使用規範,但並不是強制性的,我可以把您的解決方案來看看? – TheProgrammer