JPA中@Query支持LIKE加%,createQuery同写法报错是什么原因?
问题根因
Spring Data JPA 对@Query注解做了专属语法扩展,允许直接在JPQL中写%:参数名%的格式,框架会自动处理通配符和参数的绑定逻辑;但原生EntityManager#createQuery遵循标准JPQL语法,不支持将通配符%直接和参数占位符拼接,所以会抛出语法异常。
两种正确实现方案
方案1:参数值拼接通配符(推荐)
把通配符拼接到参数值中传入,JPQL语句不写%:
List<CustomerType> result2 = (List<CustomerType>)em.createQuery("select c from Customer c where c.custName LIKE :custName ORDER BY AGE DESC") .setParameter("custName", "%" + search + "%") .setMaxResults(3) .getResultList();
该方案逻辑清晰,无SQL注入风险,是最常用的实现方式。
方案2:JPQL中用CONCAT函数拼接
如果希望通配符逻辑写在JPQL内,可以调用JPQL标准函数CONCAT拼接通配符和参数:
List<CustomerType> result2 = (List<CustomerType>)em.createQuery("select c from Customer c where c.custName LIKE CONCAT('%', :custName, '%') ORDER BY AGE DESC") .setParameter("custName", search) .setMaxResults(3) .getResultList();
其他修正提示
你当前代码中的setMAXResults为拼写错误,正确方法名为setMaxResults,部分严格的JPA实现会因为该拼写错误抛出异常,建议同步修正。
内容的提问来源于stack exchange,提问作者Kasis Shrestha
相关产品推荐
相关产品推荐

