就像hibernate文档所说的那样,命名查询的目的是将HQL从项目中的不同位置清除到某个xml中的单个位置(在声明方法的情况下),这意味着在查询修改的情况下不需要重新编译,而是重新加载会话工厂这是必需的,这意味着在大多数情况下,由于查询对象被缓存,服务器将启动。但是在注释的情况下,我需要在实体级别定义命名查询。因此,这里再次需要编译。我的问题是命名查询在性能上是否也有帮助。这是我的理解:
1)当我使用命名查询时,只是查询对象被缓存在第二级缓存中。当我说只是查询对象时,这意味着只缓存查询语法而不是查询结果。如果它的权利是正确的,那么可能仅在HQL的情况下才有用,因为那可以避免将HQL转换为本机查询,因此每次触发的查询都会具有良好的时间性能。
但是,如果我们使用本机sql,则命名查询不会提供这种优势,因为在这种情况下不会进行翻译。
因此,命名查询的主要优势是建立sql的中央存储库。是的,在HQL的情况下,它还可以为我们节省到本地sql的翻译时间,但是请记住,查询对象将占用jvm的生命周期,并且会占用一些内存。所以这里要折衷。
命名查询有两个小优点:
它们还有一个缺点:使用命名查询读取或调试代码时,如果不搜索其定义就无法立即查看正在执行哪个查询。
其余的实际上并不重要:
我倾向于在使用查询的代码中定义查询,并对它们进行单元测试。这使代码更易读,更健壮。