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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:43:31