我有一个命名查询,如下所示;
@NamedQuery(name = "MyEntityClass.findSomething", query = "SELECT item FROM MyTable mytbl")
现在我想在此查询中附加动态排序子句(基于UI参数)
我可以使用JPQL做一个相同的例子(比如如何在Entity类中设置动态ORDER BY)
我已经尝试过使用CriteriaQuery,但现在正在寻找一个JPQL实现。
答案 0 :(得分:3)
根据定义,NamedQueries不是动态的,以编程方式更改它们是不正确的。
所以要做的就是创建一个JPQL查询(但不是命名查询),如下所示:
TypedQuery<MyEntity> query = em.createdQuery("SELECT item FROM MyEntity item ORDER BY "+sortingCol, MyEntity.class);
另一方面,如果你真的想要使用命名查询,你可以通过以下方式实现:
@NamedQuery(name = "MyEntityClass.findSomething", query = MyEntity.NAMED_QUERY)
@Entity
public class MyEntity {
public static final NAMED_QUERY= "SELECT item FROM MyTable mytbl";
//+your persistent fields/properties...
}
//and later in your code
TypedQuery<MyEntity> query = entityManager.createQuery(MyEntity.NAMED_QUERY + " ORDER BY " + sortingCol, MyEntity.class);
答案 1 :(得分:2)
JPA 2.1的补充
从JPA 2.1开始,可以通过编程方式定义命名查询
这可以使用entityManagerFactory.addNamedQuery(String name, Query)
来实现。
示例:
Query q = this.em.createQuery("SELECT a FROM Book b JOIN b.authors a WHERE b.title LIKE :title GROUP BY a");
this.em.getEntityManagerFactory().addNamedQuery("selectAuthorOfBook", q);
// then use like any namedQuery
参考here
这可能很有用,例如,如果将orderby字段定义为应用程序参数。因此,当应用程序启动或首次运行查询时,您可以使用已定义的OrderBy字段定义NamedQuery。
另一方面,如果您的OrderBy可以随时更改(或更改),那么您需要动态查询而不是NamedQuery(静态)。每次(按性能)(重新)创建一个NamedQuery是不值得的。
答案 2 :(得分:1)
<强> @NameQuery 强>
JPQL
转换为SQL
。@NameQuery
注释创建/更新查询。Reflection API
使用change the annotation value at runtime。我认为这不是解决方案,也不是你想要的。<强> em.createQuery()强>
JPQL
转换为SQL
。