2010-04-15 70 views
6

一位新同事刚刚建议在Hibernate中使用带有注释的命名HQL查询(即@NamedQuery),而不是在我们的XxxxRepository类中嵌入HQL。Hibernate命名的HQL查询(在注释中)是否被优化?

我想知道什么是使用注释是否提供除集中查询的任何好处?

尤其是有一些表演的增益,例如因为查询只解析一次上课的时候被加载,而不是每次执行库方法的时间?

+0

我更喜欢对他们两个的标准查询... – NimChimpsky 2012-06-06 10:11:06

回答

8

从临EJB 3(麦克·基思):

” ......我们建议命名查询尽可能持久性提供商通常会采取措施预编译JPQL命名查询到SQL作为部署或初始化的一部分一个应用程序的阶段“。

尽管这本书是关于JPA的,但一般建议适用于Hibernate。但是,由于Hibernate缓存了已解析的HQL/JPQL,因此您可能看不到很大的性能提升。使用命名查询的另一个优势是,它使您可以选择在部署时使用映射文件覆盖查询,而无需重新构建应用程序;如果您需要调整生产中的查询,这会很有用。

5

除了任何可能的性能增益外,我相信另一个优点是通过使用带注释的HQL查询可以保护自己免受SQL注入攻击。

对于Web应用程序,如果查询包含任何用户输入的数据,这是非常重要的。

http://en.wikipedia.org/wiki/SQL_injection

3

拉尔斯关于SQL注入评论可能引起误解,虽然我不认为这是他的意图,我想提供更多的一点背景知识,使注释不被误解。

这是真的,命名查询被规范参数,并使用命名参数之一是防范SQL注入一步。但是,它不能完全防止SQL注入(请参阅他的链接了解更多信息)。评论的措辞表明,使用命名查询是防止注入攻击的唯一必要步骤。实际上,普通查询可以(也应该)被参数化,并且可以提供与注入攻击完全相同的绝对级别作为命名查询,参数化查询只是阻止注入攻击的许多必要步骤之一。

要添加到Lars关于webapps的评论中,请注意,擦除数据以防止注入攻击非常重要,无论应用程序是否面向外部,或者输入数据是来自用户还是来自其他数据库(甚至是同一个数据库)。

2

就个人而言,我觉得性能增益大于事实,你的HQL查询服务器启动过程中解析,为您提供即时消息,如果你的HQL查询是错误的那么重要。

我倾向于在测试之前而不是在测试之前捕获这些错误。

最后时刻,在测试过程中,我没有工作的代码来到一个查询,实际上已经从来没有做过,因为外壳的。在使用命名查询时,这在服务器启动时会立即显现出来。

而且,当然,我不喜欢让我的HQL与Java代码混合在一起。