【发布时间】:2016-03-01 09:56:12
【问题描述】:
我对这些技术还很陌生,我需要一个推销来了解做事的好方法。 我有一个员工实体,我想通过对端点进行 GET 查询来列出它们。在对字段应用过滤器后,我必须返回一个员工页面。目前,GET 查询上的 Pageable 有效,但不是我的过滤器。
这是我的 REST 端点:
@RequestMapping(value = "/employees",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
@Transactional(readOnly = true)
public ResponseEntity<List<EmployeeDTO>> getAllEmployees(Pageable pageable, String filters) throws URISyntaxException, JSONException {
JSONObject sfilters = null;
try {
sfilters = new JSONObject(filters.trim());
} catch (JSONException e) {
e.printStackTrace();
}
// I wish this on could works, but still have to update it if we add fields to our Employee entity
Page<Employee> page = employeeRepository.findAllByCompanyIdAndFirstnameLikeAndLastnameLike(
userService.getUserWithAuthorities().getCompany().getId(),
sfilters.get("firstname").toString(),
sfilters.get("lastname").toString(),
pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/employees");
ResponseEntity<List<EmployeeDTO>> result = new ResponseEntity<>(page.getContent().stream()
.map(employeeMapper::employeeToEmployeeDTO)
.collect(Collectors.toCollection(LinkedList::new)), headers, HttpStatus.OK);
return result;
}
注意:我必须过滤比这更多的字段,但我想让示例尽可能清晰。
我的存储库方法:
Page<Employee> findAllByCompanyIdAndFirstnameLikeAndLastnameLike(Long idCompany, String firstname, String lastname, Pageable pageable);
客户端,它运行良好,我为可分页发送了良好的参数,并将我的过滤器转换为 JSONObject。但现在我需要关于如何在查询中正确生成动态过滤器的建议。我的 JPA 存储库方法不起作用。
我尝试使用谓词,但它没有帮助,因为当我给它一个 Predicate arg 时方法会失败。如果一个或多个与您的 pred 匹配但不确定它们是否用于通过动态查询检索一组项目,则此方法似乎很适合逐项检查。
编辑:我创建了一个实现规范的 EmployeeSpecification 类,但我想返回一个谓词列表/数组,而不仅仅是一个。因此,要覆盖的默认方法返回单个 Predicate。我怎样才能设法从这个实体获得多个谓词?
感谢您的任何提示、帮助和过去的经验分享。
【问题讨论】:
-
主题被浏览了 13 次。我不得不承认,JPA 问题并不是最想要的科目。我会检查文档并阅读一些内容。