2010-11-19 28 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");