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

JPQL中如何用带通配符的字符串集合匹配查询结果?

没问题!IN表达式确实不支持通配符匹配,但咱们有好几种办法实现你要的效果,下面给你分享两种常用且靠谱的方案:

方案一:动态构建OR + LIKE条件(直观灵活)

如果你的模式集合元素不多,直接动态生成多个LIKE条件并用OR拼接是最直观的方式。Spring Data JPA的Specification接口刚好适合做这种动态查询:

// 先让你的Repository接口继承JpaSpecificationExecutor
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {}

// 在业务逻辑层或自定义实现里编写查询逻辑
public List<User> findMatchingNames(List<String> patterns) {
    return userRepository.findAll((root, query, criteriaBuilder) -> {
        // 处理空集合情况,避免意外查询全表
        if (patterns.isEmpty()) {
            return criteriaBuilder.disjunction();
        }
        // 为每个通配符模式创建LIKE条件
        List<Predicate> predicates = new ArrayList<>();
        for (String pattern : patterns) {
            predicates.add(criteriaBuilder.like(root.get("name"), pattern));
        }
        // 用OR拼接所有条件
        return criteriaBuilder.or(predicates.toArray(new Predicate[0]));
    });
}

调用时传入Arrays.asList("%mi%", "%or"),就能匹配到Smith(符合%mi%)和Ford(符合%or)了。

方案二:用JPQL的EXISTS子查询(简洁优雅)

如果想直接在JPQL里写静态查询,用EXISTS子查询结合集合参数是更紧凑的方式,它会检查实体字段是否匹配集合中的任意一个模式:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE EXISTS (" +
           "    SELECT p FROM :patterns p WHERE u.name LIKE p" +
           ")")
    List<User> findByNameMatchingPatterns(@Param("patterns") List<String> patterns);
}

这个写法的逻辑很清晰:对每一个用户u,只要集合patterns里存在任意一个模式p能匹配u.name,就会被纳入查询结果。Hibernate等主流JPA提供者都支持这种语法,代码也更简洁。

一些注意事项
  • 务必确保传入的模式参数已经包含正确的通配符(%匹配任意字符,_匹配单个字符),JPQL不会自动帮你添加
  • 如果有可能传入空的模式集合,记得做判断(比如方案一里的空集合处理),否则会返回表中所有数据,这通常不是预期结果
  • 当模式集合元素较多时,EXISTS方案的性能会优于大量OR拼接的方式,因为数据库查询优化器对EXISTS的处理更高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:30:52