我正在尝试使用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或对是重要的,以分离它们与不存在。这是因为我得到的优先权是
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或pairs列表周围添加括号
和或对的列表是这样构建到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));
每个和或对周围的括号也一样好