代码之家  ›  专栏  ›  技术社区  ›  shelley

表达式[duplicate]中的JPQL LOWER函数

  •  0
  • shelley  · 技术社区  · 8 年前

    是否可以执行字符串函数,例如 LOWER IN JPQL中的表达式?

    我尝试使用类似于以下内容的JPQL查询(为了简洁起见,查询已经简化):

    SELECT e from MyEntity e WHERE LOWER(e.myAttribute) IN (LOWER(?1))
    

    但是,对于Hibernate/Oracle,这样的查询会导致与以下类似的错误:

    WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 7001, SQLState: 07001
    ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Invalid parameter count for "LOWER", expected count: "1"; SQL statement:
    select e.my_attribute from my_entity e where lower(e.my_attribute) in (lower(?, ?, ?)) [7001-197]
    

    生成的SQL查询无效:

    lower(e.my_attribute) in (lower(?, ?, ?))
    

    我认为应该更像以下内容:

    lower(e.my_attribute) in (lower(?), lower(?), lower(?))
    

    我不清楚JPA规范中是否可以将字符串函数应用于 表达式,如果没有,那是什么合理的选择。我用的是 在 OR 下

    我使用的是jpa2.0/hibernate4.2/oracle11g/12c,我希望避免使用任何特定于供应商的代码,但是如果可能的话,使用纯JPA/JPQL。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Amith Kumar    8 年前

    JPQL按设计运行。它正确地解释了它,这就是函数和参数在代码中的定义方式。

    IN (LOWER(?1)) lower 1 在你的情况下 list . 所以你看到了错误。

    要使用Oracle获得所需的结果,可以使用内置的Oracle集合类型 ODCIVARCHAR2LIST

    SELECT e 
    FROM   myentity e 
    WHERE  Lower(e.myattribute) IN 
           ( 
                  SELECT Lower(column_value) 
                  FROM   table(sys.odcivarchar2list(?1)))
    

    注: table 函数,因此下面也将起作用:

    SELECT e 
    FROM   myentity e 
    WHERE  Lower(e.myattribute) IN 
           ( 
                  SELECT Lower(column_value) 
                  FROM   sys.odcivarchar2list(?1))