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) 不支持日期查询

JPA Query By Example (QBE) 不支持日期查询

Grafana:警报查询中不支持模板变量

雪花中不支持的子查询

Excel SQL 查询中的 DateAdd 函数不起作用

JPA 支持查询 Postgres JSON 字段