jpa 查询中不支持 DateAdd 函数
Posted
技术标签:
【中文标题】jpa 查询中不支持 DateAdd 函数【英文标题】:DateAdd function not support in jpa query 【发布时间】:2018-10-11 12:59:56 【问题描述】:DateAdd 函数作为 sql-server 中的 sql 查询工作正常,因为我想从日期中减去一些天数并且我得到了结果,但是当我在 jpa 项目中使用相同的时候,spring boot 项目还没有开始。
在存储库类下面,如果我注释掉下面的代码行,spring boot 项目将按预期启动。
public interface domainRepository extends CrudRepository<domainTable , Long>
@Query("Select DATEADD(day,-(1), d.date) from domainTable d "
+ "where d.id in (:id)")
public Date getDate(@Param("id") Long id);
如何解决这个问题?还是我必须编写一个单独的函数而不是 DATEADD?
【问题讨论】:
“否则”什么?发出威胁并不是真正激励人们的方式。 JPA 规范是公开的,所有 JPA 文档都会告诉您“DATEADD”在 JPQL 中无效(尽管它在 SQL 中有效)。那些相同的 JPA 文档会告诉您一个FUNCTION
函数,它允许您调用任何 SQL 函数。为什么不读一点?或者为什么不在 JAVA 中添加日期?!
@DN1,我认为您需要放松一下,这很可能只是英语水平不佳。除此之外,我同意在 java 中做日期数学。
首先感谢您回复我。我真的需要一些帮助。我可以使用日历进行日期加/减,但我更喜欢在 jpql 本身中进行并返回日期。请建议我如何做到这一点。
第一响应者已经告诉你该怎么做......查找 JPQL FUNCTION
。 *** 上也有很多关于它的帖子,人们认为 JPA 接受了 SQL。 ***.com/questions/30937839/…
@DN1 请给我建议
【参考方案1】:
实际上,JPA 不支持时间段操作,因为并非所有数据库都支持它。所以你有以下选择:
1- 以编程方式计算日期(Java 端,使用日历 API 或 Java 8 日期时间 API)。
2- 使用本机查询。
【讨论】:
原生查询不是搁浅的使用方式,我认为是这样,只需要使用 hql 查询。 请看我的回答。 JPQL 现在确实支持时间段操作。【参考方案2】:至少在 JPA 2.2 的 Hibernate (5.3.7) 实现中,这个 JPQL 查询非常适合 mysql:
TypedQuery<Usuario> query2 = getEntityManager().createQuery("select distinct p.usuario from Peticion p"
+ " where p.deletionDate is null and p.fechaAprobacion is not null"
+ " and ?1 between subdate(p.fechaInicio, 'interval 1 microsecond') and"
+ " adddate(p.fechaFin, 'interval 1 day')", Usuario.class);
Date dateDate = Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());
query2.setParameter(1, dateDate, TemporalType.DATE);
【讨论】:
以上是关于jpa 查询中不支持 DateAdd 函数的主要内容,如果未能解决你的问题,请参考以下文章
JPA Query By Example (QBE) 不支持日期查询