【问题标题】:Hibernate exception on encountering mysql := operator遇到 mysql := 运算符时的休眠异常
【发布时间】:2016-01-13 18:17:49
【问题描述】:

当我执行以下代码时发生异常:

Exception: org.springframework.orm.hibernate3.HibernateQueryException: 
Not all named parameters have been set

这是我的代码:

queryString = SET @quot=0,@latest=0,@comp='';
    select B.* from (
    select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
    select time,company,quote-@quot as `change`, @quot:=quote curr_quote
    from stocks order by company,time) A
    order by company,time desc) B where B.LATEST=1;

list = getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)throws     HibernateException,SQLException {
        SQLQuery  query = session.createSQLQuery(queryString);
        query.setParameterList("list", custIds);
        return query.list();
    }

这种行为的原因是什么?

【问题讨论】:

  • : 被解释为命名参数的开始,因此:= 也被解释为这样。
  • 你能给出解决这个问题的建议吗
  • 我也怀疑它是一个有效的查询,看起来像 2 个查询(首先是集合,然后是查询)。我在您的查询中也没有看到:list,所以不确定您绑定到什么。如何解决我不确定的问题,而不是使用 hibernate 使用普通的 JdbcTemplate 来执行查询。
  • 请查看sqlfiddle.com/#!2/4f8a1/2中的查询执行情况,用于获取特定列的行之间的差异
  • 尝试通过在 : 字符前面放置一个 `\` 来转义它们

标签: java mysql spring hibernate


【解决方案1】:

有点难以理解,您正在执行的查询到底是什么,但是如果您需要在本机查询中使用冒号字符,在您的情况下作为“赋值”运算符,您应该转义所有冒号\\ 在您的 java 字符串中与查询发生,所以它可能是这样的:

select B.* from (
  select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp\\:=A.company as company from (
      select time,company,quote-@quot as `change`, @quot\\:=quote curr_quote
      from stocks order by company,time) A
    order by company,time desc) B where B.LATEST=1;

更新: 似乎还不能在 Hibernate 原生查询中转义冒号,有一个关于它的 open issue。这意味着,您不能在 Hibernate 本机查询中使用冒号,而不是命名参数。您可以尝试创建一个函数并调用它而不是调用查询。

【讨论】:

  • 当我尝试转义时:通过放置 \ 编译错误发生,因为双反斜杠是为了转义 Java 字符串。所以我尝试使用 \\:= Hibernate 将其视为单个 \ 并且发生相同的异常
  • 是的,如果你使用hibernate,它似乎不可能在本机查询中转义冒号,看看这里hibernate.atlassian.net/browse/HHH-1237你可以做到的唯一方法是创建一些sql函数和用它。或者尝试应用补丁,但你必须构建hibernate,我认为这不是一个好的解决方案
  • 感谢斯坦尼斯拉夫解决我的问题
  • 虽然这仅适用于休眠 5.1.1 及更高版本
【解决方案2】:

您可以创建一个命名查询,然后在 spring jpa 存储库或 hibernate 中使用它。这个link 帮助我解决了类似的问题。

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 2019-03-20
    • 2011-02-14
    • 2018-12-07
    • 2014-06-16
    • 2018-04-17
    • 2011-09-20
    • 2017-07-06
    • 2012-02-24
    相关资源
    最近更新 更多