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

咨询JPA中LIKE与IN组合查询的可行实现方案

在JPA中实现LIKE与多模糊匹配的结合查询

你之前的两种写法存在问题:

  • 第一种first_name in ('%abc%','%def%')逻辑错误,IN是精确匹配,会查找完全等于'%abc%'的字符串,而不是模糊匹配包含abc的内容。
  • 第二种like any(array['%neh%','%bip%'])是PostgreSQL的原生语法,JPA标准API不支持这种写法,所以无法直接运行。

下面是几种在JPA中实现多条件模糊匹配的可行方案:

方案1:使用JPA Criteria API动态构建OR条件

适合需要动态传入模糊匹配列表的场景,能灵活生成多个LIKE条件并用OR连接:

public List<YourEntity> findByFirstNameLikeIn(List<String> patterns) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<YourEntity> cq = cb.createQuery(YourEntity.class);
    Root<YourEntity> root = cq.from(YourEntity.class);
    
    // 构建多个like条件,用OR连接
    Predicate[] predicates = patterns.stream()
        .map(pattern -> cb.like(cb.lower(root.get("firstName")), "%" + pattern.toLowerCase() + "%"))
        .toArray(Predicate[]::new);
    
    cq.where(cb.or(predicates));
    return entityManager.createQuery(cq).getResultList();
}

方案2:使用JPQL拼接OR条件

如果模糊匹配的条件数量固定,可以直接在JPQL中写多个LIKE并用OR连接:

@Query("SELECT e FROM YourEntity e WHERE LOWER(e.firstName) LIKE %:pattern1% OR LOWER(e.firstName) LIKE %:pattern2%")
List<YourEntity> findByFirstNameLikePatterns(@Param("pattern1") String pattern1, @Param("pattern2") String pattern2);

如果是动态数量的参数,这种写法就不太方便,推荐用Criteria API。

方案3:使用原生SQL查询(适配特定数据库)

如果你的项目固定使用PostgreSQL这类支持ANY语法的数据库,可以用原生SQL实现:

@Query(value = "SELECT * FROM your_table WHERE lower(first_name) LIKE ANY(array[:patterns])", nativeQuery = true)
List<YourEntity> findByFirstNameLikeAny(@Param("patterns") List<String> patterns);

注意这里传入的patterns需要是已经带%的字符串列表,比如Arrays.asList("%neh%", "%bip%")。

内容的提问来源于stack exchange,提问作者Bipul Thapa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:36:28