如何正确使用 DateTimeFormatter 将其传递到存储库以执行查询?

How do I use the DateTimeFormatter correctly to pass it onto a Repository to execute a query?

我一直在尝试使用 DateTimeFormatter API 将 String 转换为 Date 格式并在存储库界面中查询它。但是,我的 SearchController 中不断出现错误,并且无法弄清楚原因。

搜索控制器:

    @GetMapping("/search")
public String searchAccessInfoByDate(@RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate, Model model) {
    DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-mm-dd");
    LocalDateTime date1 = LocalDate.parse(startDate, dateTimeFormatter1).atTime(LocalTime.MIN);
    DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-mm-dd");
    LocalDateTime date2 = LocalDate.parse(endDate, dateTimeFormatter2).atTime(LocalTime.MAX);
    List<AccessInfo> foundAccessInfos = accessInfoRepository.searchAccessInfoByDate(date1, date2);
    model.addAttribute("foundAccessInfos", foundAccessInfos);
    return "search";
}

AccessInfoRepository:

@Repository
public interface AccessInfoRepository extends JpaRepository<AccessInfo, Long> {
    @Query("select i from AccessInfo i where i.accessDate between ?1 and ?2")
    List<AccessInfo> searchAccessInfoByDate(LocalDateTime startDate, LocalDateTime endDate);
}

AccessInfo.java(实体):

package com.assignment.restapi.domain;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Date;

@Entity
public class AccessInfo {
    @Id
    @GeneratedValue(strategy =  GenerationType.AUTO)
    private Long id;
    private String accessedApi;
    private Integer httpResponseStatusCode;
    private Integer accessCount;
    private Integer averageRequestTime;
    private LocalDateTime accessDate;

    public AccessInfo() {

    }

    public AccessInfo(String accessedApi, Integer httpResponseStatusCode, Integer accessCount,  Integer averageRequestTime, LocalDateTime accessDate) {
        this.accessedApi = accessedApi;
        this.httpResponseStatusCode = httpResponseStatusCode;
        this.accessCount = accessCount;
        this.averageRequestTime = averageRequestTime;
        this.accessDate = accessDate;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getAccessedApi() {
        return accessedApi;
    }

    public void setAccessedApi(String accessedApi) {
        this.accessedApi = accessedApi;
    }

    public Integer getHttpResponseStatusCode() {
        return httpResponseStatusCode;
    }

    public void setHttpResponseStatusCode(Integer httpResponseStatusCode) {
        this.httpResponseStatusCode = httpResponseStatusCode;
    }

    public Integer getAccessCount() {
        return accessCount;
    }

    public void setAccessCount(Integer accessCount) {
        this.accessCount = accessCount;
    }

    public Integer getAverageRequestTime() {
        return averageRequestTime;
    }

    public void setAverageRequestTime(Integer averageRequestTime) {
        this.averageRequestTime = averageRequestTime;
    }

    public LocalDateTime getAccessDate() {
        return accessDate;
    }

    public void setAccessDate(LocalDateTime accessDate) {
        this.accessDate = accessDate;
    }
}

search.html(显示搜索结果的位置):

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
<form method="get" action="/search" style="padding: 10px 0">
    <div>
        <input type="date" name="startDate" th:value="startDate">
        〜
        <input type="date" name="endDate" th:value="endDate">
        <input type="submit" value="検索">
    </div>
</form>
<table border="1" th:if="${foundAccessInfos}">
    <tr>
        <th>APIエンドポイント</th>
        <th>ステータスコード</th>
        <th>アクセス回数[ns]</th>
        <th>リクエスト平均時間</th>
        <th>アクセスされた日付け</th>
    </tr>
</table>

当前错误:

"Text '2018-09-30' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2018, MinuteOfHour=9, DayOfMonth=30},ISO of type java.time.format.Parsed"]}

问题在于您的 DateTimeFormatter 模式无法解析您提供的日期。您需要使用 DateTimeFormatter 模式,如下所示

DateTimeFormatter.ofPattern("yyyy-MM-dd")

请参阅 DateTimeFormatter doc 了解有关模式的详细信息。

如果您使用了@Madhu Bhat 的答案,请在您的存储库中更改 class ? to : 和 1 到 startDate 和 2 到 endDate,我不知道你是否可以在 jpa 中使用 ?1 和 ?2 但我有如下代码的存储库。

@Repository
public interface AccessInfoRepository extends JpaRepository<AccessInfo, Long> {
    @Query("select i from AccessInfo i where i.accessDate between :startDate and :endDate")
    List<AccessInfo> searchAccessInfoByDate(LocalDateTime startDate, LocalDateTime endDate);
}

希望对您有所帮助。