您好我在HQL中执行以下查询时遇到了问题:
答案 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])
一旦你开始工作,你会发现比较这样的日期很少有效,因为日期必须同意毫秒,但这是另一个问题的问题:)