我正在重写一个巨大的搜索查询,最初是在 Hibernate Criteria 中创建的。我尝试仅使用标准 JPA 解决方案。我面临的问题是,我想创建一个像这样的 where 子句:
select ... where (stopTime - startTime) > minimalLength
这对于日历值来说似乎是不可能的,因为我无法使用 Criteria API 对它们进行算术运算。有解决办法吗?
更新1
正如答案中提到的(现已删除),Criteria API 具有 sum
、diff
、prod
方法,但是它们的签名为:
<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 的 function 方法,并使用它来调用(不幸的是供应商特定的)datediff SQL Server 方法。它看起来像这样:
builder.function("datediff", Integer.class, builder.literal("second"), startTime, stopTime)
这几乎有效,唯一的问题是,datediff
不能使用String作为第一个参数,它需要一个关键字(即不带引号的“第二”)。有人知道如何将文字传递给函数吗?
最佳答案
好吧,最后我放弃了,用 HQL 而不是 Criteria API 来做。我们只希望我的问题能够在 Criteria API 的下一次迭代中得到解决...
关于java - JPA Criteria API - 日历值的算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280772/