簡體   English   中英

JPA命名查詢與標准API?

[英]JPA Named Queries vs Criteria API?

Criteria APINamedQuery之間的決策是否有啟發式/最佳實踐/規則集?

到目前為止我的想法:
命名查詢通常更具可讀性。 條件查詢更靈活。
兩者都是預編譯的。 我傾向於盡可能長時間地使用命名查詢,然后改為標准。

但也許通過使用標准API來“靈活”查詢的沖動可能暗示了次優設計(即關注點的分離)?

謝謝

命名查詢更加優化(它們被解析/准備一次)。 Criteria查詢是動態的(它們不是預編譯的,盡管某些JPA提供程序(如EclipseLink)維護標准准備緩存)。

我只會將標准用於動態查詢。

例如,當必須基於變量和多個搜索條件動態生成查詢時,條件查詢是一個很好的選擇。

對於靜態查詢,JPQL更具可讀性,我更喜歡使用它們而不是條件查詢。 你可能會失去一些安全感,但單元測試會讓你更自信。

另一個觀點是,盡管條件查詢不是那么可讀,但它是類型安全的,因此為您提供了編譯時類型檢查。 如果在具有許多實體和許多查詢的項目中更改數據庫,那么在編譯時查看由於更改而導致哪些查詢出錯是非常有用的。

另一方面,我不確定這比JPQL的簡單性更有益

我實際上經歷了Hibernate(4.3.0-SNAPSHOT)源代碼和EclipseLink(2.5.0-SNAPSHOT)源代碼,並查看了每個代碼中的JPA實現。

EclipseLink顯然不是您描述的方式的線程安全。 具體來說,它會嘗試重復重新計算聯接。

Hibernate的實現看起來對我來說是安全的。 我不是百分百肯定,但似乎確實如此。 我會說,由於未指定,未來不能保證這是真的。

但是,我會警告你,我不認為你會獲得太多收益。 從我所看到的,查詢的大部分編譯實際上是在“createQuery”階段完成的,所以你甚至不會獲得很多緩存結果。

JPA還提供了一種使用@NamedQuery和@NamedQueries注釋構建靜態查詢(如命名查詢)的方法。 在可能的情況下,在JPA中優先考慮命名查詢而不是動態查詢是一種很好的做法。 來自http://www.objectdb.com/java/jpa/query/api

暫無
暫無

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

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