簡體   English   中英

在Hibernate中重用查詢

[英]Reusing Queries in 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中重用Queries是沒有用的。 確保始終使用參數化查詢,因此請保持計划緩存較小。

您可以使用“命名查詢”:注釋您的實體類

@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描述的命名查詢可以滿足您的需求,但我懷疑它能為您帶來任何顯着的性能提升。

如果您的數據庫支持它們,則使用准備語句,無論您是否使用Hibernate的命名查詢。 最多可以省去解析HQL查詢的麻煩。 命名查詢更適用於代碼重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM