【问题标题】:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: Apr near line 1, column 81org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:Apr 靠近第 1 行,第 81 列
【发布时间】:2016-04-22 06:54:08
【问题描述】:

我正在尝试从数据库中查询数据列表,具体取决于日期。

这是我的代码:

@Override
public List<CoursChange> listeTauxChange(Date datJourCchn) {

    Query q = sessionFactory.getCurrentSession().createQuery(
            "from CoursChange  c where c.datJourCchn="+datJourCchn);
    return q.list();

}

错误是:

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:Apr 靠近第 1 行,第 81 列 [来自 com.gtec.GestionChangeDevise.entity.CoursChange c where c.datJourCchn=Mon Apr 18 00:00:00笏 2016]

这是怎么引起的,我该如何解决?

【问题讨论】:

    标签: hibernate date


    【解决方案1】:

    首先,永远不要通过将查询与字符串化参数值连接来对查询进行参数化。在查询字符串中使用namedpositioned参数声明,然后将参数值设置为查询对象。

    Query q = sessionFactory.getCurrentSession().createQuery(
            "from CoursChange  c where c.datJourCchn=:DAT_JOUR_CCHN");
    q.setParameter("DAT_JOUR_CCHN", datJourCchn, TemporalType.DATE)
    return q.list();
    

    【讨论】:

    • 更糟糕的是,AprdatJourCchn.toString() 的结果。 TemporalType.DATE 我认为没有必要。
    • 感谢您的回复,我会尝试并告诉您:)
    • @v.ladynev 第三个参数TemporalType 有时不是必需的,有时却非常重要。仅使用来自给定问题的信息,没有人可以决定在这种情况下它是必要的还是重要的。
    • 它有效,先生;谢谢,但没有提及 TemporalType.DATE :)
    【解决方案2】:

    你想念" 来包装 datJourCchn

    "from CoursChange  c where c.datJourCchn = \"" + datJourCchn + "\"" 
    

    [from com.gtec.GestionChangeDevise.entity.CoursChange c where c.datJourCchn=Mon Apr 18 00:00:00 WAT 2016] 的第 81 列是一个空格,这会导致错误的查询字符串。

    【讨论】:

    • 感谢回复我;但我无法理解 () 的用处
    • 现在的错误是:unexpected char: '"' [from com.gtec.GestionChangeDevise.entity.CoursChange c where c.datJourCchn = "null"]
    • "null" 不是java.util.Date,你应该先检查datJourCchn是否正确传递,然后查询字符串。它应该看起来像 from com.gtec.GestionChangeDevise.entity.CoursChange c where c.datJourCchn="Mon Apr 18 00:00:00 WAT 2016"
    猜你喜欢
    • 2015-11-14
    • 2015-07-12
    • 2016-02-21
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多