【问题标题】:False translation from hql to sql从 hql 到 sql 的错误翻译
【发布时间】:2014-03-10 20:22:15
【问题描述】:

在我的 (hql) 查询中,我有以下 where-clause:

LOWER( f_umlautfree2( replace(user.lastName, ' ', '')||replace(user.firstName, ' ', '')  ) ) LIKE LOWER ('%'||( f_umlautfree2( replace(replace(:name, ',', ''), ' ', '') ) )||'%')

如果我让打印出“真实”的 sql 查询,它会以这种方式“翻译”:

lower(idmanlight.f_umlautfree2((replace(user0_.lastName||' '||'')||replace(user0_.firstName||' '||'')))) like lower(('%'||idmanlight.f_umlautfree2(replace(replace('%Croci%'||','||'')||' '||''))||'%'))

导致类似“没有函数替换(文本)存在...”之类的错误

为什么所有的,(在函数的括号之间)都被||替换了?

这是完整的 hql 查询:

select
    distinct user.dbId,
    user.lastName,
    user.firstName
from
    User user  LEFT join user.permissions
where
    LOWER( f_umlautfree2( replace(user.lastName, ' ', '')||replace(user.firstName, ' ', '')  ) ) LIKE LOWER ('%'||( f_umlautfree2( replace(replace(:name, ',', ''), ' ', '') ) )||'%')
and
    (user.employee IS NOT NULL OR user.lecturer IS NOT NULL OR user.ethRelated IS NOT NULL OR user.pdbGuest IS NOT NULL)
and
    user.valid = :valid  
order by
    user.lastName, user.firstName asc

这是完整的 sql 查询:

select
     distinct user0_.dbId as col_0_0_,
     user0_.lastName as col_1_0_,
     user0_.firstName as col_2_0_
from
     idmanlight.NETHZ_USER user0_
left outer join
     idmanlight.NETHZ_USER_PERMISSION permission1_
         on user0_.dbId=permission1_.NETHZ_USER_dbId
left outer join
     idmanlight.PERMISSION permission2_
         on permission1_.permissions_dbId=permission2_.dbId
where
     (
         lower(idmanlight.f_umlautfree2((replace(user0_.lastName||' '||'')||replace(user0_.firstName||' '||'')))) like lower(('%'||idmanlight.f_umlautfree2(replace(replace('%Croci%'||','||'')||' '||''))||'%'))
     )
     and (
         user0_.employee is not null
         or user0_.lecturer is not null
         or user0_.ethRelated is not null
         or user0_.pdbGuest is not null
     )
     and user0_.valid=?
 order by
     user0_.lastName,
     user0_.firstName asc

【问题讨论】:

    标签: hibernate hql jpa-2.0 jpql


    【解决方案1】:

    HQL 执行 not support replace 功能。你应该用Dialect.registerFunction()注册它。

    here 是一个例子)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多