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

如何使用Spring Data JPA编写针对数据库列的LIKE匹配查询

实现方案

方案1:使用原生SQL查询(最贴合现有写法)

直接在Spring Data JPA的Repository接口中使用@Query注解标注原生SQL即可,不需要依赖JPA的封装LIKE逻辑:

public interface YourTableRepository extends JpaRepository<YourEntity, Long> {
    // 原生PostgreSQL写法,:number为入参
    @Query(value = "SELECT * FROM your_table WHERE :number LIKE column_name || '%'", nativeQuery = true)
    List<YourEntity> findMatchByNumber(@Param("number") String number);
}

如果希望适配更多数据库,可以把||换成标准SQL的CONCAT函数:
SELECT * FROM your_table WHERE :number LIKE CONCAT(column_name, '%')

方案2:使用JPQL查询(无原生SQL依赖,跨数据库兼容)

如果不想使用平台相关的原生SQL,用JPQL也可以实现同样逻辑,JPA的JPQL支持CONCAT函数和灵活的LIKE表达式位置:

@Query("SELECT e FROM YourEntity e WHERE :number LIKE CONCAT(e.columnName, '%')")
List<YourEntity> findMatchByNumber(@Param("number") String number);

方案3:使用Criteria API实现动态查询

如果需要动态拼接查询条件,可以用JPA Criteria API实现,核心是用cb.literal()将入参转为查询表达式,放在LIKE的左侧:

@Autowired
private EntityManager entityManager;

public List<YourEntity> findDynamicMatch(String number) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<YourEntity> cq = cb.createQuery(YourEntity.class);
    Root<YourEntity> root = cq.from(YourEntity.class);
    
    // 核心逻辑:LIKE左侧为入参字面量,右侧为列拼接%的结果
    cq.where(cb.like(
        cb.literal(number), 
        cb.concat(root.get("columnName"), "%")
    ));
    
    return entityManager.createQuery(cq).getResultList();
}

注意事项

  • 如果你的number入参是数值类型,需要先转为字符串,或者在SQL中显式转换为文本类型,避免类型匹配错误,比如PostgreSQL中可以写WHERE CAST(:number AS TEXT) LIKE column_name || '%'
  • 数据量较大时可以给对应列建text_pattern_ops索引优化查询性能:CREATE INDEX idx_col_prefix ON your_table (column_name text_pattern_ops);

内容的提问来源于stack exchange,提问作者Martin Schröder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:57:03