Java 如何使用springframework.data.jpa.repository.Query查找两个日期和时间之间的所有结果
我正在为这样一个简单的任务而挣扎,我不知道我做错了什么 基于个人研究,我似乎在编码我应该做的事情,以便使用Spring数据搜索两个日期之间的所有记录。据我所知,“@Temporal(TemporalType.DATE)”具有“魔力” 存储库Java 如何使用springframework.data.jpa.repository.Query查找两个日期和时间之间的所有结果,java,hibernate,jpa,spring-data-jpa,spring-data,Java,Hibernate,Jpa,Spring Data Jpa,Spring Data,我正在为这样一个简单的任务而挣扎,我不知道我做错了什么 基于个人研究,我似乎在编码我应该做的事情,以便使用Spring数据搜索两个日期之间的所有记录。据我所知,“@Temporal(TemporalType.DATE)”具有“魔力” 存储库 import java.math.BigDecimal; import java.util.Date; import java.util.List; import javax.persistence.TemporalType; import org.sp
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.TemporalType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.Temporal;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.mybank.accountmanagement.model.Transaction;
@Repository
public interface TransactionRepository extends JpaRepository<Transaction, Long> {
@Query(value = "SELECT * FROM transactions WHERE account_id=:idAccount AND CAST(created_at AS date) BETWEEN :fromDate AND :toDate ", nativeQuery = true)
List<Transaction> findByAccountIdWithCreationDateBetween(@Param("idAccount") Long idAccount,
@Param("fromDate") @Temporal(TemporalType.DATE) Date fromDate,
@Param("toDate") @Temporal(TemporalType.DATE) Date toDate);
}
审计模型
package com.mybank.accountmanagement.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = { "createdAt", "updatedAt" }, allowGetters = true)
public abstract class AuditModel implements Serializable {
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_at", nullable = false, updatable = false)
@CreatedDate
private Date createdAt;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_at", nullable = false)
@LastModifiedDate
private Date updatedAt;
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
}
在搜索“from date”:“2020-08-02”、“toDate”:“2020-08-02”时,我要返回的内容
但它没有返回任何记录
***编辑
由于某种未知原因,我的记录与fromDate和toDate的确切日期匹配,因此从结果中标记出来
[
{
"createdAt": "2020-08-02T16:29:08.085+00:00",
"updatedAt": "2020-08-02T16:29:08.085+00:00",
"id": 1,
"amount": 1.00,
"transactionType": 2,
"accoout_id": 1
},
{
"createdAt": "2020-08-02T16:29:11.185+00:00",
"updatedAt": "2020-08-02T16:29:11.185+00:00",
"id": 2,
"amount": 2.00,
"transactionType": 1,
"accoout_id": 1
}
]
到目前为止还不错
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.mybank.accountmanagement.BankStatementFilter;
import com.mybank.accountmanagement.model.Transaction;
import com.mybank.accountmanagement.repository.TransactionRepository;
import com.mybank.accountmanagement.service.TransactionService;
@RestController
public class TransactionController {
@Autowired
TransactionService transactionService;
@Autowired
TransactionRepository transactionRepository;
@GetMapping("/transaction/{accountId}/bankstatement")
public List<Transaction> bankStatement(@PathVariable(value = "accountId") Long accountId,
@Valid @RequestBody BankStatementFilter bankStatementFilter) {
return transactionRepository.findByAccountIdWithCreationDateBetween(accountId,
bankStatementFilter.getFromDate(), bankStatementFilter.getToDate());
}
}
闻起来我用这个POJO BankStatementFilter做了些蠢事
以下是我在将新日期()与2020-08-02进行比较时注意到的内容。既然我不在乎时间,对吗
***最后评论
它现在正在工作。我把POJO换成了bellow。如果我正在做一些愚蠢的事情,我会感谢你的建议。顺便说一句,我最初的问题得到了100%的回答
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class BankStatementFilter {
private Date fromDate;
private Date toDate;
public Date getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
this.fromDate = simpleDateFormat.parse(fromDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
public Date getToDate() {
return toDate;
}
public void setToDate(String toDate) {
String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
this.toDate = simpleDateFormat.parse(toDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
您是否尝试过使用>=和
对spring数据存储库方法没有任何影响。只有在实体中对其进行注释时,它才会产生影响@Temporal.Date
- 相反,也要执行以下操作来转换参数:
@Query(value=“SELECT*FROM account\u id=:idAccount的交易记录”+
“和演员阵容(于截止日期创建)”+
“在演员阵容(:fromDate AS date)和演员阵容(:toDate AS date)之间”
,nativeQuery=true)
列表由(@Param(“idAccount”)长idAccount查找,
@参数(“fromDate”)日期fromDate,
@参数(“toDate”)日期(toDate);
- 这里是我与您的实体建立的示例项目,除了
,因为如果您愿意比较,这不在问题中。您可以将项目作为maven导入IntelliJ并运行主应用程序,它将插入数据并返回帐户
2020-08-08
,它也需要创建一个java日期对象。最好的选择是打印出控制器内接收到的日期对象
import java.util.Date;
public class BankStatementFilter {
private Date fromDate;
private Date toDate;
public Date getFromDate() {
return fromDate;
}
public void setFromDate(Date fromDate) {
this.fromDate = fromDate;
}
public Date getToDate() {
return toDate;
}
public void setToDate(Date toDate) {
this.toDate = toDate;
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class BankStatementFilter {
private Date fromDate;
private Date toDate;
public Date getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
this.fromDate = simpleDateFormat.parse(fromDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
public Date getToDate() {
return toDate;
}
public void setToDate(String toDate) {
String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
this.toDate = simpleDateFormat.parse(toDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
@Query(value = "SELECT * FROM transactions WHERE account_id=:idAccount " +
"AND CAST(created_at AS date) " +
"BETWEEN CAST(:fromDate AS date) AND CAST(:toDate AS date)"
, nativeQuery = true)
List<Transaction> findBy(@Param("idAccount") Long idAccount,
@Param("fromDate") Date fromDate,
@Param("toDate") Date toDate);