Criteria Builder和OR创建了" bad" SQL

时间:2014-05-01 20:34:15

标签: jpa

我正在尝试使用条件查询重新创建以下SQL代码段:

SELECT t0.column1, 
       t0.column2 
  FROM SALES_TBL t1, 
       PRD t0
 WHERE (t0.column3 = '640420022' OR 
        t1.column4 = '640420022' OR 
        t1.column5 = '640420022' OR 
        t1.column6 = '640420022') AND
       t1.column7 = t0.column7

我正在构建一个Predicates列表,其中包含以下内容:

preds.add(cb.or(cb.equal((Expression<?>) rootProd.get("prd"), ic.toUpperCase()),
                cb.equal((Expression<?>) rootProd.get("salesTbl").get("upc"), ic),
                cb.equal((Expression<?>) rootProd.get("salesTbl").get("salesCd"), ic),
                cb.equal((Expression<?>) rootProd.get("salesTbl").get("smisCd"), smis)));

但生成的实际SQL如下所示:

SELECT t0.column1,
       t0.column2
  FROM SALES_TBL t3,
       SALES_TBL t2,
       SALES_TBL t1,
       PRD t0
 WHERE ((((t0.column3 = '640420022') OR
          (t1.column4 = '640420022')) OR
          (t2.column5 = '640420022')) OR
       (t3.column6 = '640420022')) AND
       (((t1.column7 = t0.column7) AND
       (t2.column7 = t0.column7)) AND
       (t3.column7 = t0.column7)))

此查询(显然具有实际列名称)大约需要10分钟才能返回,当它返回时,只有预期为1时有25行。

我是JPA的新手,这个让我发疯。如何让JPA在顶部生成查询而不是生成查询?

我似乎对我开放的唯一其他课程是不让我们使用CriteriaBuilder.or,而是一次构建一个Predicate,并将结果合并到一个List中,我可以将其发送回前端。但这似乎并不合适。

任何帮助将不胜感激。

谢谢,

格雷格

0 个答案:

没有答案