簡體   English   中英

JPA/Hibernate:命名查詢與本機查詢 | 使用哪一個?

[英]JPA/Hibernate: Named Query vs Native Query | Which one to use?

有開發人員編寫的本機查詢

String sql = "Select * from TERP_META where id=" + id + " and type='KCH' ORDER BY ID ASC";
return entityManagerMaster.createNativeQuery(sql, TerpStatus.class).getResultList();

我們也可以為 thist 編寫命名查詢。

現在對於簡單的查詢,我們應該使用 Native 還是 Named? 我知道 Native 應該用於復雜的查詢,而對於簡單的 Named 則使用但不知道原因。

任何人都可以澄清兩者在執行方面的技術差異以在兩者中做出最佳選擇嗎?

它根本不是命名與本機的對比,因為您可以命名本機查詢。 本機是 SQL 查詢,而非本機,在 JPA 世界中,指的是使用 JPQL——一種基於 java 實體的不同查詢語言。 您選擇哪個取決於您的應用程序要求,因為通常只能通過特定於數據庫的(本機)SQL 訪問更多特定於數據庫的功能。

我個人不喜歡必須搜索 SQL 查詢才能在整個應用程序代碼中找到它們,並在以影響模式的方式更改 model 時找出問題 - 使用 JPQL 可以讓 JPA 驗證針對 model 的查詢,而不必預先執行針對數據庫的 SQL 查詢。 與我一起工作的開發人員並不總是理解或使用 SQL 表,因此 JPQL 更接近於他們使用的格式(java 對象)中的數據。 它還減少了人們使用字符串連接構建 SQL 查詢並在該查詢字符串中使用一些客戶定義的值的問題/風險 - SQL 注入攻擊的常見向量。

@Chris 已經給出了很好的回答。 我只是把我的觀點放在這里

NamedQuery:NamedQuery 在編譯時進行驗證,因此它們已經過驗證。 因此它們在運行時不太容易出現異常。 在我看來,對非常常用的方法使用 NamedQuery 更好。

本機查詢:它們的編寫方式與您在數據庫客戶端(如 Sqlyog)中編寫查詢的方式相同。 最好只在遇到復雜而長的查詢時才編寫它們。 正如@Chris 所說,“SQL 注入攻擊的常見載體”。

暫無
暫無

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

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