2013-12-13 28 views
3

我正在使用CriteriaBuilder動態查詢數據庫,所有的預測都是動態生成的。JPA - 使用CriteriaBuilder的Oracle位操作

我現在面臨的問題是將此本機Oracle SQL轉換爲CriteriaBuilder API。

BITAND例如:https://stackoverflow.com/a/10617716/810277

請有人建議我的方式,使用JPA CriteriaBuilder。

在此先感謝。

+0

您使用的是哪個版本的JPA? –

+0

我使用JPA 2.0,根據你的回答,我必須首先獲取記錄然後迭代地對每個記錄進行位操作並過濾掉結果? –

+0

+1。我不明白爲什麼要投票反對這個問題。做按位是重要且非常基本的任務,它的奇怪之處在於jpa不支持它 – oak

回答

0

在JPA/Criteria API中不可能的JPA 2.0中。您將不得不: 1.在Java中執行該邏輯。 2.使用原生查詢。

在JPA 2.1中,它引入了您可以使用的Criteria API/JPQL中的function()方法。

3

您可以使用一個數學把戲做同樣的事情(有點慢,雖然):

事實:

  • 除以2 ^х將向右X(例如位移位 1011010/1000 = 1011)
  • ž模2 = 1,如果最右邊的位是1(例如1011模2 = 1)

因此,在標準API它會是這樣:

int mask = 0b00100; 
    Path<Integer> fieldToTest = root.<Integer>get("fieldToTest"); 
    Expression<Integer> div = cb.quot(fieldToTest, mask).as(Integer.class); 
    Expression<Integer> mod = cb.mod(div, 2); 
    Predicate maskMatched = cb.equal(mod, 1); 
+0

這在內部創建了在WHERE子句中投射(x/y爲帶符號)的查詢,如果x/y> = 0.5,則返回值1。如果x/y <1,我希望返回值爲0.在CriteriaBuilder中沒有floor方法。你有這個解決方案嗎? –