【问题标题】:Dynamic Named Query in Entity class using JPQL example使用 JPQL 示例的实体类中的动态命名查询
【发布时间】:2014-04-05 17:43:51
【问题描述】:

我有一个如下的命名查询;

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

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

我能否获得一个使用 JPQL 进行相同操作的示例(例如如何在 Entity 类中设置动态 ORDER BY)

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

【问题讨论】:

    标签: java jpa jpa-2.0 jpql


    【解决方案1】:

    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);
    

    【讨论】:

      【解决方案2】:

      @NamedQuery

      • Persistence Provider 在部署时将命名查询从 JPQL 转换为 SQL
      • 到目前为止,还没有在运行时使用 @NamedQuery 注释创建/更新查询的功能。
      • 另一方面,您可以使用Reflection APIchange the annotation value at runtime。我认为这不是解决方案,也不是你想要的。

      em.createQuery()

      • Persistence Provider 每次调用时都会将动态查询从 JPQL 转换为 SQL
      • 使用动态查询的主要优点是可以根据用户输入创建查询。

      【讨论】:

        【解决方案3】:

        对 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 是不值得的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-15
          • 2013-04-23
          • 2020-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-26
          相关资源
          最近更新 更多