条件生成器 where 子句
Criteria builder where clause
我正在尝试构建一个 SQL where 子句,使用 criteriaBuilder 和谓词来创建一些 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 对列表周围添加方括号
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));
每个 AND OR 对周围的括号也一样好
我自己修复了它,而不是构建 1 个数组并将其转换为 1 个谓词。
我将 AND OR 对数组转换为 1 个谓词,将 not exists 添加到另一个谓词中,然后将这个 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()])));
我正在尝试构建一个 SQL where 子句,使用 criteriaBuilder 和谓词来创建一些 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 对列表周围添加方括号
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));
每个 AND OR 对周围的括号也一样好
我自己修复了它,而不是构建 1 个数组并将其转换为 1 个谓词。
我将 AND OR 对数组转换为 1 个谓词,将 not exists 添加到另一个谓词中,然后将这个 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()])));