You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Predicate中同时使用AND与OR的实现问题

解决多OR条件与AND条件组合的查询逻辑

嘿,我完全懂你的需求——就是要把两个OR条件打包成一组,再和一个AND条件结合,实现(id包含指定值 OR name包含指定值) AND manu等于指定值的逻辑对吧?其实核心就是用括号明确OR条件的分组,确保数据库先计算OR的组合结果,再和AND条件做匹配,避免因为运算符优先级搞乱逻辑。

我给你举几个常见场景的实现例子:

原生SQL写法

直接用括号把两个OR条件括起来,再跟AND条件组合,比如:

SELECT * FROM your_table
WHERE (id LIKE '%${searchKeyword}%' OR name LIKE '%${searchKeyword}%') 
  AND manu = '${targetManu}';

注意:如果用预编译语句(推荐,防止SQL注入),占位符写法会更安全,比如MySQL里:

SELECT * FROM your_table
WHERE (id LIKE CONCAT('%', ?, '%') OR name LIKE CONCAT('%', ?, '%')) 
  AND manu = ?;

这里的括号是关键!因为SQL中AND的优先级比OR高,如果不加括号,数据库会先执行name LIKE ... AND manu = ...,再和id LIKE ...做OR,完全偏离你要的逻辑。

JPA Criteria API写法(Java ORM场景)

如果用JPA的Criteria构建动态查询,可以把OR条件先组合成一个Predicate组,再和AND条件拼接:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<YourEntity> query = cb.createQuery(YourEntity.class);
Root<YourEntity> root = query.from(YourEntity.class);

// 构建OR条件组:id包含关键词 或 name包含关键词
Predicate orConditions = cb.or(
    cb.like(root.get("id"), "%" + searchKeyword + "%"),
    cb.like(root.get("name"), "%" + searchKeyword + "%")
);

// 组合AND条件:OR组的结果 且 manu等于目标值
Predicate finalCondition = cb.and(
    orConditions,
    cb.equal(root.get("manu"), targetManu)
);

query.where(finalCondition);
List<YourEntity> result = entityManager.createQuery(query).getResultList();

MyBatis XML映射写法

在MyBatis的XML里同样可以用括号包裹OR组,结合参数占位符:

<select id="queryByConditions" resultType="com.yourpackage.YourEntity">
    SELECT * FROM your_table
    WHERE (id LIKE CONCAT('%', #{searchKeyword}, '%') OR name LIKE CONCAT('%', #{searchKeyword}, '%'))
      AND manu = #{targetManu}
</select>

不管用哪种方式,核心思路都是一致的:先把需要做OR判断的条件用括号归为一组,再和AND条件进行逻辑与运算,这样就能精准实现你要的查询逻辑啦。

内容的提问来源于stack exchange,提问作者Ceri Turner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:15:43