我正在尝试使用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));
每个“与”或“或”对周围的括号都一样
答案 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()])));