在Hibernate中重用查询

我在Hibernate中使用HQL查询,只是想知道,如果我可以提高我的应用程序重用查询的性能。

通常你必须为每个会话创建一个新的Query对象:

Session session;
Query q1 = session.createQuery("select a from Article a where id=:id");
q1.setInteger("id",123);
List result = q1.list();

现在我在HQL中有相对复杂的查询,我不想一遍又一遍地分析。 有没有办法在另一个会话中创建查询并重用它? 喜欢这个:

Session session;
Query q2 = q1.reattach();
q2.setInteger("id",123);
List result = q2.list();

如果Hibernate无论如何都使用准备好的语句,这应该是一个显着的性能增益,尤其是与用于缓存预准备语句的ConnectionPool结合使用时。

编辑 :在Hibernate中重用查询通常是不需要的,因为查询计划已经缓存在类QueryPlanCache中。 命名查询也不提供任何改进,因为它们只是用来查询查询字符串,并且没有计划与它们关联。

总结:在Hibernate中重用查询没有用处。 只要确保总是使用参数化查询,那么保持计划缓存很小。


你可以使用'命名查询':注释你的实体类

@Entity
@NamedQuery(name="Article.findById", query="select a from Article a where id=:id")     
public class Article{ ...

然后它会在启动时被解析一次,只要你想使用它,你只需调用:

session.getNamedQuery("Article.findById")
        .setInteger("id",123); 

按照Kiavash描述的命名查询完成你所问的内容,但我怀疑它会给你带来任何显着的性能提升。

如果数据库支持它们,则使用Prepared语句,无论您是否使用Hibernate的命名查询。 最多可以节省解析HQL查询的麻烦。 命名查询更多用于代码重用。

链接地址: http://www.djcxy.com/p/51823.html

上一篇: Reusing Queries in Hibernate

下一篇: Getting the Name of a Column from the row and column indexes in PHPExcel