2014-10-09 61 views
2

我正在重寫最初在Hibernate Criteria中創建的巨大搜索查詢。我試圖只使用標準的JPA解決方案。我與面臨的問題是,我想打一個where子句是這樣的:JPA Criteria API - 使用日曆值的算術

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

而這似乎並不可能與日曆值,因爲我無法通過標準API做算術題與他們。有沒有解決方案?

更新1

正如在答案(現在它被刪除),標準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) 

因此它們不適用於Calendar(或甚至對於Date)。

更新2

我想,我在正確的軌道上。我決定使用CriteriaBuilderfunction方法,並用它來調用(不幸供應商特定的)datediff SQL Server方法。它看起來像這樣:

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

作品,唯一的問題是,datediff字符串作爲第一個參數的工作,它需要一個關鍵字(即「第二」不帶引號)。有沒有人知道將函數傳遞給函數的方法?

+0

我有同樣的問題,跑進你在更新時遇到同樣的死衚衕2. – 2015-05-11 21:11:38

回答

1

好吧,最後我放棄了,並且使用HQL完成了Criteria API。我們只是希望,我的問題將在標準API的下一次迭代...

+0

有類似的問題:https://stackoverflow.com/questions/9449003/compare-date-entities- in-jpa-criteria-api 但用正確的答案。 – 2017-06-11 22:36:24

1

我有同樣的問題,跑進你在更新時遇到同樣的死衚衕2.

的唯一途徑圍繞這個我可以想到的,就是創建一個不需要字面「秒」的UDF,並委託到datediff。

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

    RETURN datediff(second, @from, @to) 

END 

GO 

這是一個雜牌組裝電腦,但工程。

+0

是的,它可以工作,如果你可以使用存儲過程,對我來說這不是一個選項。 – meskobalazs 2015-05-11 21:27:35

+0

這是一個UDF,而不是一個存儲過程;但我明白你的觀點 - 如果向模式添加SQL函數是一個選項,這只是一個選項。 – 2015-05-11 21:31:47

0

我最終只是轉換爲unix_timestamp,它們是數字,可以進行區分。 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)