【发布时间】:2014-03-21 00:23:25
【问题描述】:
您好,我在 HQL 中执行以下查询时遇到问题:
【问题讨论】:
您好,我在 HQL 中执行以下查询时遇到问题:
【问题讨论】:
这是运行查询的一种非常危险的方法。这是造成 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])
一旦你得到这个工作,你会发现像这样比较日期很少起作用,因为日期必须同意毫秒,但这是另一个问题的问题:)
【讨论】: