如何正确使用 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);
}
希望对您有所帮助。
我一直在尝试使用 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);
}
希望对您有所帮助。