[英]Specific query in java spring called from rest controller
我正在尝试通过其字段customerId过滤名为Measure的表。 这是该路径的控制器开始处的样子:
@RequestMapping(method = GET, path = "/nodes/{id}/ports/{portid}/measures")
@ResponseBody
public ResponseEntity<?> getPortMeasures(@PathVariable long id, @PathVariable long portid,
@RequestParam Optional<Long> from,
@RequestParam Optional<String> order,
@RequestParam Optional<String> countername,
@RequestParam Optional<Long> to) {
其次是调用查询底层的方法
if (order.isPresent() && order.get().equals("asc")) {
return ResponseRestBuilder.createSuccessResponse(
measureRepository.
searchAsc
(networkElementList.get(0).ip, portList.get(0).rack, portList.get(0).frame, portList.get(0).slot,
portList.get(0).portSerial, countername.get(), from.orElse(0L), to.orElse(99999999999999999L)));
}
else{
return ResponseRestBuilder.createSuccessResponse(
measureRepository.
searchDesc
(networkElementList.get(0).ip, portList.get(0).rack, portList.get(0).frame, portList.get(0).slot,
portList.get(0).portSerial, countername.get(), from.orElse(0L), to.orElse(99999999999999999L)));
}
这是查询的样子:
@Query("SELECT mes FROM Measure mes WHERE " +
"mes.nodeIp = (:nodeIp) AND " +
"mes.rack = (:rack) AND " +
"mes.frame = (:frame) AND " +
"mes.slot = (:slot) AND " +
"mes.portSerial = (:portSerial) AND " +
"lower(mes.counterName) LIKE concat('%', lower(:countername), '%') AND"+
"mes.timestamp > (:timestamp1) AND " +
"mes.timestamp < (:timestamp2) "+
"ORDER BY mes.timestamp DESC")
List<Measure> searchDesc(@Param("nodeIp") String nodeIp, @Param("rack") String rack, @Param("frame") String frame,
@Param("slot") String slot, @Param("portSerial") String portSerial, @Param("countername") String countername,
@Param("timestamp1") Long timestamp1, @Param("timestamp2") Long timestamp2);
@Query("SELECT mes FROM Measure mes WHERE " +
"mes.nodeIp = :nodeIp AND " +
"mes.rack = :rack AND " +
"mes.frame = :frame AND " +
"mes.slot = :slot AND " +
"mes.portSerial = :portSerial AND " +
"lower(mes.counterName) LIKE concat('%', lower(:countername), '%') AND " +
"mes.timestamp > :timestamp1 AND " +
"mes.timestamp < :timestamp2 "+
"ORDER BY mes.timestamp ASC")
List<Measure> searchAsc(@Param("nodeIp") String nodeIp, @Param("rack") String rack, @Param("frame") String frame,
@Param("slot") String slot, @Param("portSerial") String portSerial, @Param("countername") String countername,
@Param("timestamp1") Long timestamp1, @Param("timestamp2") Long timestamp2);
它不会过滤任何内容,因为控制器会回复0行。 我100%确信有实际的行,因为我已经检查了其他的休息电话。 我究竟做错了什么?
问题很可能与timestamp字段有关,从代码中似乎您传递了很长时间,但实际上它正在等待timestamp文字,jpa中的timestamp文字格式为{ts '2009-11-05 12-45-52.325'}
...只是检查一下,尝试从查询中删除时间戳,然后再次放入并手动提供文字...如果{ts '2009-11-05 12-45-52.325'}
,则需要找到一种方法来解析传递的long到相应的文字
问题在于字段portList.get(0).rack为“ null”。 显然,这使整个查询无法正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.