HQL Date抛出意外令牌

时间:2014-03-21 00:23:25

标签: sql grails hql

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

1 个答案:

答案 0 :(得分:0)

这是运行查询的一种非常危险的方法。这就是创建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])

一旦你开始工作,你会发现比较这样的日期很少有效,因为日期必须同意毫秒,但这是另一个问题的问题:)