使用JPQL示例在Entity类中进行动态命名查询

时间:2014-03-04 09:25:16

标签: java jpa jpa-2.0 jpql criteria-api

我有一个命名查询,如下所示;

@NamedQuery(name = "MyEntityClass.findSomething", query = "SELECT item FROM MyTable mytbl")

现在我想在此查询中附加动态排序子句(基于UI参数)

我可以使用JPQL做一个相同的例子(比如如何在Entity类中设置动态ORDER BY)

我已经尝试过使用CriteriaQuery,但现在正在寻找一个JPQL实现。

3 个答案:

答案 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
  • 使用动态查询的主要优点是查询可以根据用户输入创建。