【问题标题】:JPA - Oracle bit operations using CriteriaBuilderJPA - 使用 CriteriaBuilder 的 Oracle 位操作
【发布时间】:2014-01-01 10:57:41
【问题描述】:

我正在使用 CriteriaBuilder 动态查询 DB,所有预测都是动态生成的。

我现在面临的唯一问题是将这个原生 oracle SQL 转换为 CriteriaBuilder API。

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

请有人向我推荐一种使用 JPA CriteriaBuilder 的方法。

提前致谢。

【问题讨论】:

  • 你使用什么版本的 JPA?
  • 我使用的是JPA 2.0,根据你的回答,我必须先获取记录,然后对每条记录进行迭代操作并过滤掉结果?
  • +1。我不明白为什么要反对这个问题。按位执行是重要且非常基本的任务,jpa 不支持它很奇怪

标签: java sql oracle jpa bit-manipulation


【解决方案1】:

您可以使用数学技巧来做同样的事情(不过会慢一点):

事实:

  • 除以 2^х 会将位右移 x(例如 1011010/1000=1011)
  • z mod 2 = 1 如果最右边的位是 1(例如 1011 mod 2 = 1)

所以在 Criteria 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);

【讨论】:

  • 这在内部创建在 WHERE 子句中具有强制转换(x/y 为有符号)的查询,如果 x/y >= 0.5 则返回值 1。如果 x/y
【解决方案2】:

在 JPA 2.0 中,这在 JPQL/Criteria API 中是不可能的。你不得不: 1.要么用Java做那个逻辑。 2. 为此使用本机查询。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 2019-04-10
    • 2012-12-31
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多