条件构建器where子句

时间:2018-08-09 15:10:37

标签: java jpa criteria

我正在尝试使用criteriaBuilder和谓词构建SQL where子句,以创建一些SQL,如:

 WHERE
 (country5_.ctry_iso_cd = 'ESP'
AND datadomain6_.data_dmn_cd = 'MTH'
OR country5_.ctry_iso_cd = 'ESP'
AND datadomain6_.data_dmn_cd = 'SOU'
)
 AND NOT ( EXISTS (
     SELECT
         'NOT READY'
     FROM
         dc_dca_installation_status collection5_
     WHERE
         collection0_.installation_id = collection5_.installation_id
 ) )

AND OR对列表中的方括号对于将其与不存在的括号分开很重要。这是因为AND优先于我

WHERE
 country5_.ctry_iso_cd = 'ESP'
AND datadomain6_.data_dmn_cd = 'MTH'
or country5_.ctry_iso_cd = 'ESP'
AND datadomain6_.data_dmn_cd = 'SOU'
AND NOT ( EXISTS (
     SELECT
         'NOT READY'
     FROM
         dc_dca_installation_status collection5_
     WHERE
         collection0_.installation_id = collection5_.installation_id
 ) )

我可以毫无疑问地建立所有谓词,但我只是不知道如何在AND OR对列表周围添加方括号

“与”或“对”列表像这样被构建为1个谓词列表

 countryDomainPredicates.add(cb.and(
     cb.equal(countryJoin.get(Country_.ctryIsoCd), ud.getCountryCode()),
     cb.equal(dataDomainJoin.get(DataDomain_.code), ud.getDataDomainCode())

,子查询就是这样添加的

cb.not(cb.exists(subquery));

和位置

critQuery.where(cb.and(array));

每个“与”或“或”对周围的括号都一样

1 个答案:

答案 0 :(得分:0)

我自己修复了它,而不是建立1个数组并将其转换为1个谓词。

i将AND OR对的数组转换为1个谓词,将不存在的谓词添加到另一个谓词中,然后将2个谓词的数组用于where。

List<Predicate> predicates = new ArrayList<>();
predicates.add( addAndOrPairs(cb, root, userDataDomains));
Subquery<String> subquery = createSubQuery(cb, root);
predicates.add(cb.and(cb.exists(subquery).not()));
critQuery.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));