当前位置: 首页 > 知识库问答 >
问题:

使用标准API发布H2 DATEDIFF函数

桑思远
2023-03-14

有一个简单的实体项具有两个日期类型属性:

@Entity
public class Item {

@Id
@GeneratedValue(generator = Constants.ID_GENERATOR)
protected Long id;

@NotNull
protected String name;

@NotNull
protected Date from;

@NotNull
protected Date to

我想使用标准API来使用H2数据库“datediff”的propritary函数。因此,我有以下代码片段来完成此操作:

CriteriaQuery<Item> criteria = cb.createQuery(Item.class);
Root<Item> i = criteria.from(Item.class);
criteria.select(i).where(
      cb.gt(
            cb.function(
                        "DATEDIFF",
                        Integer.class,
                        cb.literal("DAY"),
                        i.get("from"),
                        i.get("to")
            ),
            1
      )
);
... // other code to handle result 

当我尝试执行查询时,我得到以下错误:

WARN org.hibernate.engine.jdbc.spi.sqlexceptionhelper-SQL错误:90008,SQLState:90008错误org.hibernate.engine.jdbc.spi.sqlexception-org.h2.message.dbexception.getJDBCSQlexception(dbexception.java:590)(org.h2.message.dbexception.getJDBCSQlexception(dbexception.java:429)(org.h2.message.dbexception.get(pe.java:271)在org.hibernate.param.namedParameterSpecification.bind(namedParameterSpecification.java:53)在org.hibernate.loader.hql.queryloader.bindParameterValues(queryloader.java:648)在org.hibernate.loader.loader.preparareQueryStatement(loader.java:2120)在org.hibernate.loader.loader.executeQueryStatement(loader.java:2034)在eryplan.java:219)在org.hibernate.internal.sessionimpl.list(sessionimpl.java:1396)在org.hibernate.query.internal.abstractproducedquery.dolist(abstractproducedquery.java:1558)在org.hibernate.query.internal.compile.criteriaquery.list(abstractproducedquery.java:1526)在org.hibernate.query.getresultlist(query.java:165)在

但如果我使用JPQL:

 select i from Item i where function('DATEDIFF', 'DAY', i.from, i.to) > 1

它完成时没有任何问题。此外,如果我将H2版本切换到1.3.171,标准API工作良好。我相应地使用了以下版本的H2和Hibernate 1.4.200、5.4.8.final。有人能帮忙吗?

共有1个答案

酆英达
2023-03-14

我认为您应该为您的整数值1使用一个文字,并与之进行比较:

CriteriaQuery<Item> criteria = cb.createQuery(Item.class);
Root<Item> i = criteria.from(Item.class);
criteria.select(i).where(
      cb.gt(
            cb.function(
                        "DATEDIFF",
                        Integer.class,
                        cb.literal("DAY"),
                        i.get("from"),
                        i.get("to")
            ),
            cb.literal(1)
      )
);
 类似资料:
  • 1.1. Rokid技能发布标准 1.1.1. 商标,知识产权和品牌 1.1.2. 健康相关 1.1.3. 收费相关 1.1.4. 广告 1.1.5. 色情、暴力 1.1.6. 宗教,种族和文化 1.1.7. 内容 1.1. Rokid技能发布标准 该标准适用于所有提交至Rokid开发者社区审核的公有技能(私有技能的要求不在本审核标准范围内)。本标准的内容会随着开发者社区的建设而不断完善。 如果您

  • Werkzeug 的设计意图是一个实用的工具集而不是一个框架。得益于从低级API 中分离出来 的面向用户友好的 API,Werkzeug 可以很简单的扩展另一个系统。 Request 和 Response 对象(又名”wrappers”) 提供的函数也可以来实 现一个小的功能。 例子 这个例子实现一个小的 Hello World 应用。显示用户输入的名字: from werkzeug.utils

  • 我想使用hibernate标准删除表中的所有记录,比如 我得到了以下很多帮助 是否有任何方法可以使用Criteria类或任何其他我可以使用的类来截断?请告诉我

  • 此查询用于检索一对多关系中的最后记录(请参阅SQL连接:选择一对多关系中的最后记录) 我的问题是:如何使用jpa criteria api使用subselect构建这个连接?可能吗?如果没有,可以使用jpql吗? 到目前为止我的代码:

  • JSSE API标准,可在 javax.net 和 javax.net.ssl 包找到,提供如下: 安全套接字和服务器套接字 非阻塞引擎用于生产和消费 SSL/TLS 数据流(SSLEngine) 工厂创建套接字、服务器套接字、SSL套接字,和SSL服务器套接字。通过使用套接字工厂,可以封装套接字创建和配置行为 一个类代表一个安全套接字上下文作为工厂用于安全套接字工厂和引擎 密钥和信任管理器接口(

  • 我正在尝试实现以下内容: 问:我如何用JPA 2标准实现这个? 我可以单独获得asCount结果,但不知道如何将其加入公司 提前感谢。 PS 1。有一个类似的线程使用HiberNate应用编程接口询问子级计数:HiberNate子级计数标准 2。另一个描述该主题的有用线程: JPA CriteriaBuilder——按一对多关系中关联实体的数量排序