在HQL中查找日期之间的实体

时间:2018-07-03 16:09:46

标签: java hibernate jpa hql

我正在使用HQL和javax.persistence。在我的MySQL数据库中,我有一个日期时间(例如2018-01-22 18:00:00)。从客户端来看,我没有时间来传递日期(例如2018-01-20)。我想找到日期时间在startDateendDate之间的所有实体。

public List<BillingRunEntity> getBillingRuns(List<String> accountIds, LocalDate startDate, LocalDate endDate) {
    String query = "SELECT DISTINCT bre " +
               "FROM BillingRunEntity bre " +
               "WHERE bre.accountId in :accountIds " +
               "AND bre.billingDateTime BETWEEN :startDate AND :endDate";

    return entityManager
        .createQuery(query, BillingRunEntity.class)
        .setParameter("accountIds", accountIds)
        .setParameter("startDate", startDate)
        .setParameter("endDate", endDate)
        .getResultList();
}

还有我的BillingRunEntity.java的{​​{1}}字段:

billingDateTime

1)尝试运行此查询会导致以下错误。考虑到我不在乎时间,该如何解决?

@Column(name = "billing_date_time")
private ZonedDateTime billingDateTime;

2)此查询是否可以按我期望的方式工作?我不在乎时间-如果数据库有java.lang.IllegalArgumentException: Parameter value [2018-07-03] did not match expected type [java.time.ZonedDateTime (n/a)] at org.hibernate.jpa.spi.BaseQueryImpl.validateBinding(BaseQueryImpl.java:874) at org.hibernate.jpa.internal.QueryImpl.access$000(QueryImpl.java:80) at org.hibernate.jpa.internal.QueryImpl$ParameterRegistrationImpl.bindValue(QueryImpl.java:248) at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:620) at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:180) at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:49) ,并且我传递了2018-01-22 18:00:00的{​​{1}}和startDate(甚至是{{1 }}),我希望能获得该记录。

1 个答案:

答案 0 :(得分:0)

假设数据库中的ZonedDateTime始终存储在UTC中,则只需将其转换为LocalDate

ZoneId utc = ZoneId.of("UTC");
ZonedDateTime startTime = startDate.atStartOfDay(utc);
ZonedDateTime endTime = endDate.atStartOfDay(utc).plusDays(1).minusNanos(1);

[...]

    .setParameter("startDate", startTime)
    .setParameter("endDate", endTime)

minusNanos(1)可能有点过头,但是BETWEEN运算符在两端都包含在内。

如果您未对数据库中的所有值使用相同的时区,则可能必须挖掘表使用的billing_date_time列类型以了解其如何处理时区信息。