Oracle Java Concat Like with Arguments [重复]

Posted

技术标签:

【中文标题】Oracle Java Concat Like with Arguments [重复]【英文标题】:Oracle Java Concat Like with Arguments [duplicate] 【发布时间】:2019-07-03 21:18:08 【问题描述】:

我喜欢在 Oracle SQL Developer 中执行此查询,以便测试并稍后在 Java 中实现相同的查询。

SELECT
    enti.*
FROM
    Entity enti
WHERE
    enti.apellidouno LIKE CONCAT('%',:apellido1,'%')
    AND enti.nombreuno LIKE CONCAT('%',:nombre1,'%')
    AND ( :apellido2 IS NULL OR enti.apellidodos LIKE CONCAT('%',:apellido2,'%') )
    AND ( :nombre2 IS NULL OR enti.nombredos LIKE CONCAT('%',:nombre2,'%') );

我收到了这条消息

ORA-00909:número de argumentos no válido 00909. 00000 - “参数数量无效” *原因: *行动: 线性错误:103,列:30

这个位置只是行中CONCAT clausule 中的字母C

enti.apellidouno LIKE CONCAT('%',:apellido1,'%')

现在,在我的界面中

public interface EntityRepository extends CrudRepository<Entity, Long>, JpaRepository<Entity, Long> 


    public static final String ENTITY_POR_APELLIDOS_Y_NOMBRES
            = " SELECT enti "
            + " FROM Entity enti "
            + " WHERE "
            + "  enti.apellidouno LIKE CONCAT('%',:apellido1,'%') "
            + "  AND enti.nombreuno LIKE CONCAT('%',:nombre1,'%') "
            + "  AND (:apellido2 is null OR enti.apellidodos LIKE CONCAT('%',:apellido2,'%') "
            + "  AND (:nombre2 is null OR enti.nombredos LIKE CONCAT('%',:nombre2,'%') ";

    @Query(ENTITY_POR_APELLIDOS_Y_NOMBRES)
    List<Entity> findEntityByApellidosAndNombres(
            @Param("apellido1") String apellido1, @Param("apellido2") String apellido2, 
            @Param("nombre1") String nombre1, @Param("nombre2") String nombre2);


在 Java 中我得到了:

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 
unexpected token: null near line 1, column 353 
[ SELECT enti  FROM package.Entity enti  
WHERE   enti.apellidouno LIKE CONCAT('%',:apellido1,'%')   
AND enti.nombreuno LIKE CONCAT('%',:nombre1,'%')   
AND (:apellido2 is null OR enti.apellidodos LIKE CONCAT('%',:apellido2,'%')   
AND (:nombre2 is null OR enti.nombredos LIKE CONCAT('%',:nombre2,'%') ]

【问题讨论】:

【参考方案1】:

您需要嵌套 CONCAT,因为在 Oracle 中它只处理 2 个参数:

SELECT enti.*
FROM Entity enti
WHERE enti.apellidouno LIKE CONCAT(CONCAT('%',:apellido1),'%')
 -- ...

您可以选择使用||:

SELECT enti.*
FROM Entity enti
WHERE enti.apellidouno LIKE '%' || :apellido1 || '%'

【讨论】:

以上是关于Oracle Java Concat Like with Arguments [重复]的主要内容,如果未能解决你的问题,请参考以下文章

oracle like模糊查询 concat的使用

MyBatis中Like语句使用方式

mybatis like的用法

使用 LIKE 搜索 GROUP_CONCAT

Sequelize:WHERE LIKE 子句中的 Concat 字段

mysql查询针对concat的LIKE条件[重复]