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

MySQL/JPQL子串查询:Hibernate中如何查询含指定子串的数据

问题分析与解决

你的代码存在两个核心问题:

  1. JPQL的where子句缺少匹配操作符,直接写nomeDoEstabelecimento concat(...)是无效语法,需要用like实现模糊匹配
  2. 参数和JPQL语句里重复添加%,导致匹配逻辑混乱

下面是几种正确的实现方式:

方式一:参数拼接%(简洁推荐写法)

public List<UnidadeDeSaude> pesquisar(String nome) {
    TypedQuery<UnidadeDeSaude> query = manager.createQuery(
        "from UnidadeDeSaude where nomeDoEstabelecimento like :nome", 
        UnidadeDeSaude.class
    );
    query.setParameter("nome", "%" + nome + "%");
    
    return query.getResultList();
}

方式二:JPQL concat函数构建匹配串

public List<UnidadeDeSaude> pesquisar(String nome) {
    TypedQuery<UnidadeDeSaude> query = manager.createQuery(
        "from UnidadeDeSaude where nomeDoEstabelecimento like concat('%', :nome, '%')", 
        UnidadeDeSaude.class
    );
    query.setParameter("nome", nome);
    
    return query.getResultList();
}

方式三:原生SQL适配(针对特定数据库语法)

public List<UnidadeDeSaude> pesquisar(String nome) {
    Query query = manager.createNativeQuery(
        "SELECT * FROM unidade_de_saude WHERE nome_do_estabelecimento LIKE ?", 
        UnidadeDeSaude.class
    );
    query.setParameter(1, "%" + nome + "%");
    
    return query.getResultList();
}

如果数据库对大小写敏感,可统一大小写实现忽略匹配:

TypedQuery<UnidadeDeSaude> query = manager.createQuery(
    "from UnidadeDeSaude where lower(nomeDoEstabelecimento) like lower(concat('%', :nome, '%'))", 
    UnidadeDeSaude.class
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:55:14