我正在使用HQL和javax.persistence
。在我的MySQL数据库中,我有一个日期时间(例如2018-01-22 18:00:00
)。从客户端来看,我没有时间来传递日期(例如2018-01-20
)。我想找到日期时间在startDate
和endDate
之间的所有实体。
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 }}),我希望能获得该记录。
答案 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
列类型以了解其如何处理时区信息。