SpringBoot Jpa存储库:在jpql中转换为日期

时间:2018-04-11 14:24:54

标签: jpa jpql

我的查询如下:

@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中的时间。

有没有办法实现这个目标?

由于

3 个答案:

答案 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)

忽略invoiceDate

中的时间

如果您想忽略时间戳(首先应删除列),可以将 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)