实际上,我有包含列的订单实体(表),我想根据 createddatetime 列过滤订单数据。 基本场景是,当用户选择任何日期时,例如:createddate 是 03-06-2021 并且该日期存在 3-4 条记录,因此它将能够显示 mysql 数据库中该日期存在的总记录。
@Builder.Default
@Column(updatable=false)
@JsonFormat(shape=JsonFormat.Shape.STRING,pattern="yyyy-MM-dd hh:mm:ss")
private Date createddatetime=new Date();
我在 Orders JPA 存储库中创建了这样的函数:
List<Orders> findByCreateddatetimeOrderByCreateddatetimeDesc(Date createddate);
下面是我的 API 控制器代码,用于在特定日期获取记录。但是在点击这个时,我没有得到任何回应(错误回应)。
@RequestMapping(value = AkApiUrl.onedayorder, method = { RequestMethod.POST, RequestMethod.GET }, produces = {MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<?> onedayorder(HttpServletRequest request, @RequestParam("limit") int limit, @RequestParam("createddate") String createddate ) {
CustomResponse = ResponseFactory.getResponse(request);
int min = limit - 1;
int max = Constants.limitResult;
try {
List<Orders> order = null;
List<Orders> totalorders = null;
Pageable pageable = new PageRequest(min, max, Sort.Direction.ASC, "orderid");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date onedayorder = sdf.parse(createddate);
if(createddate != null && createddate != "") {
order = ordersdao.findByCreateddatetimeOrderByCreateddatetimeDesc(onedayorder, pageable);
totalorders = ordersdao.findByCreateddatetimeOrderByCreateddatetimeDesc(onedayorder);
}else {
order = ordersdao.findAllByStatus(1, pageable);
totalorders = ordersdao.findAllByStatus(1);
}
if (order != null) {
CustomResponse.setResponse(order);
CustomResponse.setMaxlimit(Constants.limitResult);
CustomResponse.setTotalorders(totalorders.size());
CustomResponse.setStatus(CustomStatus.OK);
CustomResponse.setStatusCode(CustomStatus.OK_CODE);
}
} catch (Exception e) {
e.printStackTrace();
CustomResponse.setResponse(null);
CustomResponse.setStatus(CustomStatus.Error);
CustomResponse.setStatusCode(CustomStatus.Error_CODE);
}
return new ResponseEntity<ResponseDao>(CustomResponse, HttpStatus.OK);
}
我尝试使用@Query 使用like 运算符创建自定义查询,但再次面临类型不匹配错误。 我该如何解决这个问题?任何建议都是值得赞赏和有价值的。
在您的数据库中,日期模式是“yyyy-MM-dd hh:mm:ss”,因此执行范围查询,如:
List<Orders> findByCreateddatetimeBetweenOrderByCreateddatetimeDesc(Date createddateBegin, Date createddateEnd);
并给出一天,你想要从午夜到午夜。
数据似乎以与您搜索的格式不同的格式保存。 您可以应用以下任何解决方案:
1-确保使用相同的日期格式
2-要忽略日期的时间部分,您可以使用更大的日期并传递两个日期,例如 (createdDate >= 2021-06-14 和 createdDate < 2021-06-15)
3-拆分您的搜索日期输入并使用函数进行搜索,就像这个例子
@Query("select e from Event e where year(e.eventDate) = ?1 and month(e.eventDate) = ?2")
List<Entity> getByYearAndMonth(int year, int month);
我不确定这是否可以解决您的问题,但我使用下面的这些代码成功检索了数据,希望这可以帮助:)
我的
Repository
代码,我给出这段代码的原因是我想让你注意到findAllByCreatedDateBetween()
方法的参数类型是
LocalDateTime
:
public interface TemperatureRepository extends CrudRepository<Temperature, Integer> {
List<Temperature> findAllByCreatedDateBetween(LocalDateTime startTime, LocalDateTime endTime);
}
写你
Controller
这样的代码:
// Get data on a specific day, e.g., from `2023-04-01 00:00:00` to `2023-04-01 23:59:59`
@GetMapping("/find/temperature/{date}")
public Iterable<Temperature> findCustomerByCreatedDate(@PathVariable LocalDate date) {
return tempRepository.findAllByCreatedDateBetween(date.atStartOfDay(),
date.atTime(23, 59, 59, 999999999));
}
@GetMapping("/find/temperature")
public Iterable<Temperature> findCustomerBetweenDate(@RequestParam LocalDate from, @RequestParam LocalDate to) {
return tempRepository.findAllByCreatedDateBetween(from.atStartOfDay(),
to.atTime(23, 59, 59, 999999999));
}
和
http url
:
# Get the data on a specific date
GET http://localhost:8080/find/temperature/2023-04-02
# Get the data between two dates
GET http://localhost:8080/find/temperature?from=2023-04-02&to=2023-04-02