我的查询如下:
@Query("select distinct i from Invoice as i where i.entityId = :entityId and CAST(i.invoiceDate AS DATE) between :start and :end")
List<Invoice> findByEntityIdAndInvoiceDateBetween(@Param("entityId") String entityId, @Param("start") Date start, @Param("end") Date end);
当然不起作用,因为CAST( ... AS DATE)
不起作用。
Invoice
课程中的日期如下:
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private Date invoiceDate;
因此,假设我们在数据库中有一张invoiceDate
的发票,如“2018-01-02 12:00:00”
我们接到一个电话,例如:
findByEntityIdAndInvoiceDateBetween( someId, 2018-01-01, 2018-01-02)
此查询不会返回数据库中的发票,因为jpa生成的查询使用"2018-01-02 00:00:00"
为了解决这个问题,我想在JPA查找期间忽略invoiceDate
中的时间。
有没有办法实现这个目标?
由于
答案 0 :(得分:1)
我认为最好的解决方案是在属性定义中使用@Temporal(TemporalType.DATE)
,因此您永远不必担心,因为截断是自动执行的,即使对于查询参数也是如此。
在任何情况下,您都可以在查询中准确地执行截断,如下所示:
@Query("select distinct i from Invoice as i where i.entityId = :entityId and function('trunc', i.invoiceDate) between :start and :end")
执行mannualy trunc参数:
Date truncStart = DateUtils.truncate(start, Calendar.DATE);
Date truncEnd = DateUtils.truncate(end, Calendar.DATE);
* org.apache.commons.lang.time.DateUtils;
答案 1 :(得分:0)
如果您想忽略时间戳(首先应删除列),可以将 TemporalType 的类型更改为日期
@Temporal(TemporalType.Date)
private Date invoiceDate;
但如果您只是想在没有时间的情况下获取invoiceDate的值,可以使用 SimpleDateFormat 将日期值解析为字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.format(getInvoiceDate());
答案 2 :(得分:0)
您可以使用CAST(XXX AS LocalDate)