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

JPA Criteria API-日历值算术

甄坚白
2023-03-14

我正在重写一个巨大的搜索查询,它最初是在Hibernate Criteria中创建的。我试图只使用标准的JPA解决方案。我面临的问题是,我想做一个where子句,如下所示:

select ... where (stopTime - startTime) > minimalLength

对于日历值来说,这似乎是不可能的,因为我无法使用Criteria API对它们进行算术运算。有解决办法吗?

更新1

正如答案中提到的(现在已删除),Criteria API有sumdiffprod方法,但这些方法具有以下特征:

<N extends java.lang.Number> Expression<N>
    method(Expression<? extends N> x, Expression<? extends N> y)
<N extends java.lang.Number> Expression<N>
    method(N x, Expression<? extends N> y)
<N extends java.lang.Number> Expression<N>
    method(Expression<? extends N> x, N y)

因此它们不适用于日历(甚至不适用于日期)。

更新2

我想,我在正确的轨道上。我决定使用CriteriaBuilder的函数方法,并使用它调用(不幸的是,特定于供应商的)datediffSQL Server方法。看起来是这样的:

builder.function("datediff", Integer.class, builder.literal("second"), startTime, stopTime)

这几乎是可行的,唯一的问题是,datdiff不使用字符串作为第一个参数,它需要一个关键字(即没有引号的“第二”)。有人知道一种方法来传递一个字面到函数吗?

共有3个答案

何聪
2023-03-14

最后,我简单地转换成了unix_时间戳,这是数字,可以区分。很遗憾,JPA不能为函数提供参数。

cb.greaterThan(
  cb.diff(
    cb.function("unix_timestamp", Long.class, root.get(Table_.until)),
    cb.function("unix_timestamp", Long.class, root.get(Table_.from))
  )
, 3600L*longerThanHours)
柯景龙
2023-03-14

我遇到了同样的问题,也遇到了你在更新2中遇到的同样的死胡同。

我能想到的唯一解决方法是创建一个UDF,它不需要字面上的“秒”,并将委托给datediff。

 CREATE FUNCTION [dbo].[datediff_seconds]
 (
    @from datetime,
    @to datetime
 )
 RETURNS int
 AS
 BEGIN

    RETURN datediff(second, @from, @to)

 END

 GO

这是个难题,但有效。

叶嘉颖
2023-03-14

好的,最后我放弃了,用HQL istead的Criteria API实现了。希望我的问题能在Criteria API的下一次迭代中得到解决。。。

 类似资料:
  • 我得根据年、月、日、时、分来数次数。(秒统一为零,我不需要秒) 我选择了HashMap作为数据结构。 我没有用“约会”。是因为,Android Devloper这样说。 日期(int year,int month,int Date,int hrs,int min,int sec)API级别1中不推荐使用此构造函数。从JDK 1.1版开始,由calendar.set(年+1900,month,dat

  • 我目前正在尝试这样做,当我在日历视图中选择一天时,该天的所有事件都会列出。我很难让它显示一天中的所有事件(看起来它在上午12点到11点59分不起作用?)。这里是我目前拥有的。 和 如果我有12am-11:59am的事件1和12pm-11:59pm的事件2,则仅列出事件2。

  • 问题内容: 目前,我有一个Date对象代表一个时间。我要如何在这个物件上加上5分钟? 问题答案: 您可以使用,这将使添加任何时间长度变得容易: 对于您的情况,您可以像这样添加时间(以毫秒为单位):

  • 日历组件用来选择年月日,可以代替系统原生的日历组件,提供更统一的视觉和交互以及更好的兼容性。日历组件需要初始化才能使用,最简单的方式是通过一下JS代码来初始化,绑定到一个input元素上: $("#my-input").calendar({     value: ['2015-12-05'] }); 当你点击input元素后,会自动弹出一个JS生成的日历组件。当用户选择日期之后,input的值

  • Rustam帮助Arshaw建造了一个非常棒的角度模块!过来看。与Angular 7一起工作。 我以前在实现下面的FullCalendar时遇到问题。我想你们也需要更新一下。 如何使用Angular 5正确实现fullcalendar而不出现任何错误?我试图将其实现到一个特定的组件中。我安装了以下软件包 jquery 仅供参考,下面的帖子是我找到的最接近解决方案。我遵循了指令,但仍然出现了“JQu

  • 介绍 日历组件用于选择日期或日期区间,2.4 版本开始支持此组件。 引入 import { createApp } from 'vue'; import { Calendar } from 'vant'; const app = createApp(); app.use(Calendar); 代码演示 选择单个日期 下面演示了结合单元格来使用日历组件的用法,日期选择完成后会触发 confirm