【问题标题】:HQL Date throwing unexpected tokenHQL 日期抛出意外令牌
【发布时间】:2014-03-21 00:23:25
【问题描述】:

您好,我在 HQL 中执行以下查询时遇到问题:

【问题讨论】:

    标签: sql grails hql


    【解决方案1】:

    这是运行查询的一种非常危险的方法。这是造成 SQL 注入风险的事情。 从不将值连接到 SQL 或 HQL 字符串中。始终使用 PreparedStatement 方法,即在 SQL/HQL 字符串中使用占位符并以编程方式设置值。这样,驱动程序(以及 HQL 中的 Hibernate)可以对生成的 SQL 执行正确的操作。当然这里的值是日期而不是用户提交的字符串,但原则仍然成立。

    你需要做的是运行一个更像是的查询

    'select stuff from bar b where b.dateCreated = ?'
    

    在 HQL 中,您还可以使用命名参数,这些参数通常更易于阅读和自我记录,例如

    'select stuff from bar b where b.dateCreated = :date'
    

    然后将值设置为调用的一部分,而不是字符串连接。

    这里的问题是日期的 Java/Groovy toString 值与 SQL(或 HQL)中的日期格式完全不同。幸运的是,您不需要知道该格式应该是什么,因为 JDBC 驱动程序知道。

    所以你的查询应该是

    def co = Bid.executeQuery(
       'select b.job from Bid b left join b.job j where j.dateCreated = :date',
       [date: fromDates[i])
    

    这里我使用名称date,但这是任意的,只需将映射中的键名与值匹配即可。您还可以使用 SQL 风格的 ?字符和值列表:

    def co = Bid.executeQuery(
       'select b.job from Bid b left join b.job j where j.dateCreated = ?',
       [fromDates[i])
    

    一旦你得到这个工作,你会发现像这样比较日期很少起作用,因为日期必须同意毫秒,但这是另一个问题的问题:)

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      相关资源
      最近更新 更多