使用Pageable的原生查询出现WHERE语法错误,如何修复?
修正后的带Pageable的原生SQL查询
以下是修正后的完整代码,解决了WHERE子句的语法错误:
@Query(value = "SELECT PERSONA, APELLIDOMATERNO, APELLIDOPATERNO, NOMBRES, NOMBRECOMPLETO, TIPODOCUMENTO," + "DOCUMENTO, FECHANACIMIENTO, SEXO, DIRECCION, TELEFONO, DOCUMENTOFISCAL, CORREOELECTRONICO," + "ESTADO, CELULAR, CASE WHEN ESEMPRESA IS NULL THEN 'NO' WHEN ESEMPRESA = 'Y' THEN 'SI' ELSE 'NO' END AS esempresa" + " FROM Prospecto" + " WHERE (:p_documento is null or :p_documento = '' or DOCUMENTO = :p_documento)" + " AND (:p_nombre is null or :p_nombre = '' or UPPER(NOMBRECOMPLETO) LIKE CONCAT('%', UPPER(:p_nombre), '%'))" + " AND (:p_empresa is null or :p_empresa = '' or UPPER(ESEMPRESA) LIKE CONCAT('%', UPPER(:p_empresa), '%'))" + " AND ESTADO = 'A'" + " ORDER BY 1 DESC", nativeQuery = true) Page<Prospecto> getPersonasActive(@Param("p_documento") String documento, @Param("p_nombre") String nombre, @Param("p_empresa") String empresa, Pageable pageable);
修改说明
- 参数引用错误修正:原代码中
UPPER(With the method:p_empresa)是无效的参数写法,改为UPPER(:p_empresa),确保ORM框架能正确绑定参数。 - 表别名错误修正:原代码
p.ESTADO = 'A'中的p未定义表别名,直接改为ESTADO = 'A';若要使用别名,可给表添加别名FROM Prospecto p,然后用p.ESTADO。 - LIKE拼接优化:替换
'%' + UPPER(:p_nombre) + '%'为CONCAT('%', UPPER(:p_nombre), '%'),适配多数数据库的字符串拼接语法,避免语法错误。 - 泛型类型补全:将返回类型
Page改为Page<Prospecto>(替换为你的实际实体类),避免原始类型带来的类型不安全问题。 - SQL语法规范:移除别名
esempresa的单引号,改为AS esempresa,符合SQL标准语法。
内容的提问来源于stack exchange,提问作者gabriel quispe
相关产品推荐
相关产品推荐

