2010-11-19 79 views

回答

2

命名查詢由持久性提供處理創建的EntityManagerFactory時。您無法在運行時動態更改/修改/追加任何關於命名查詢的任何內容。

如果您使用的是JPA 2.0,並且需要在運行時執行高性能動態查詢的方法,則應該查看Criteria API。

+0

雖然是真的,「你不能改變/修改/添加關於什麼在運行時動態地命名查詢「,對於生成的底層SQL,這不是真實的。例如,考慮何時調用setMaxResults()或setFirstResult():您將通過添加一些限制和偏移量子句來修改實際查詢。這只是爲了說明在dbms中NamedQuery和編譯查詢之間沒有嚴格的依賴關係。 – Jack 2016-09-01 12:59:40

1

來自Java EE 5文檔:「用於指定Java持久性查詢語言中的命名查詢,該查詢語言是元數據中表達的靜態查詢。查詢名稱的範圍爲持久性單元」。

就像它說的那樣,它是靜態的&您無法在運行時更改查詢。 相反,使用自定義查詢或如果排序元素是固定的,那麼你可以使用註釋;

字段:

@OrderBy(value="nickname") 
List<Person> friends; 

方法:

@OrderBy("nickname ASC") 
public List<Person> getFriends() {...}; 
0

即使無法將order-by子句添加到指定的查詢中,也可以提供參數orderBy。下面是一個完全有效的查詢:

SELECT u FROM User u ORDER BY :orderBy 

而且你要改變的東西,如訂購:

query.setParameter("orderBy", "id"); 
相關問題