gpt4 book ai didi

java - 在 Hibernate 中重用查询

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:02 25 4
gpt4 key购买 nike

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

通常你必须为每个 session 创建一个新的查询对象:

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 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);

关于java - 在 Hibernate 中重用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5528782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com