MySQL/JPQL子串查询:Hibernate中如何查询含指定子串的数据
问题分析与解决
你的代码存在两个核心问题:
- JPQL的
where子句缺少匹配操作符,直接写nomeDoEstabelecimento concat(...)是无效语法,需要用like实现模糊匹配 - 参数和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
相关产品推荐
相关产品推荐

