当前位置: 首页 > 知识库问答 >
问题:

条件生成器where子句

梁新觉
2023-03-14

我正在尝试使用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或PAIRES列表中添加括号

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或AND对周围的括号也一样好

共有1个答案

蒋泰
2023-03-14

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

我将AND或PAIR数组转换为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 Server 2005存储过程。该存储过程采用三个参数。参数如下: @StateID为int, @ CountyID为int, @ CityID为int 这些参数用于查询客户列表。如果参数值不为null,我基本上想做一个“ AND”。但是,我目前无法执行if- else。如果参数值不为null,如何添加这些子句。换一种说法: 问题答案: 加上一些OR语句: 对

  • 问题内容: 我目前有一个查询,它将根据我想使用的任何条件从数据库中提取一堆信息。 如果参数=’‘,我希望能够删除注释部分并仅显示所有行 例如,如果我使用它,它将按该参数搜索,如果我使用它,将按该参数搜索。 我已经尝试使用以下方法和其他一些尝试,但是进展并不很快。 问题答案: 您可能需要考虑构建查询。

  • 问题内容: 在此找到了两个类似的问题,但无法弄清楚如何应用于我的方案。 我的函数有一个名为 @IncludeBelow 的参数。值是0或1(BIT)。 我有这个查询: 如果@IncludeBelow为0,我需要查询如下: 如果@IncludeBelow为1,则最后一行需要排除。(即不应用过滤器)。 我猜想它必须是一条语句,但无法弄清楚语法。 这是我尝试过的: 显然,这是不正确的。 正确的语法是什么

  • 如何在Hibernate中为下面给定的查询编写criteria builder api查询?batchId不是主键 从用户中选择批号('1','3') 我尝试过: 除了数据库中存在的数据外,我什么也得不到。

  • 我想对group by子句和where子句使用hibernate标准。 就像我有一个sql这样: 在使用标准组BY时,我如何在hibernate投影中传递截断的日期。

  • 问题内容: 例如,我对我的书籍清单有动态过滤器,可以在其中设置特定的颜色,作者和类别。该过滤器可以一次设置多种颜色,也可以设置多种类别。 如何有条件地添加“ where”? 问题答案: 如您在API文档中所见,collection()方法返回一个CollectionReference。CollectionReference扩展了Query。Query.where()和Query.orderBy()