当前位置: 首页 > 知识库问答 >
问题:

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

艾英范
2023-03-14

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

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

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

我可以得到一个使用JPQL做同样事情的例子吗(比如如何在实体类中设置动态ORDER BY)

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

共有3个答案

孟海
2023-03-14

@namedQuery

  • 持久性提供程序在部署时将命名查询从JPQL转换为SQL

em.createQuery()

  • 每次调用时,持久性提供程序都会将动态查询从JPQL转换为SQL
  • 使用动态查询的主要优点是可以根据用户输入创建查询。
彭风华
2023-03-14

对JPA 2.1的补充

从JPA2.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

参考这里

例如,如果将orderby字段定义为应用程序参数,这可能会很有用。因此,当应用程序启动或在第一次运行查询时,可以使用定义的OrderBy字段定义NamedQuery。

另一方面,如果您的OrderBy可以随时更改(或更改很多),那么您需要动态查询而不是NamedQuery(静态)。每次(根据性能)(重新)创建NamedQuery是不值得的。

米夕
2023-03-14

根据定义,NamedQuery不是动态的,以编程方式更改它们是不正确的。

因此,方法是创建一个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);
 类似资料:
  • 我有一个命名查询,如下所示; @NamedQuery(name=“MyEntityClass.findSomething”,query=“从MyTable mytbl中选择项”) 现在我需要将动态排序子句附加到此查询(基于UI输入参数) 所以我的问题是,我仍然可以在实体类中定义NamedQuery吗。 我已经使用StringBuffer在我的Business Impl类中定义了命名查询,并为排序顺

  • 问题内容: 我有这种形式:http : //jsfiddle.net/dfJeN/ 如您所见,输入的名称值是静态设置的: ,则表单验证可以正常工作(添加一些内容并从输入中删除所有文本,必须显示一个文本)。 然后,我尝试动态设置名称值:http : //jsfiddle.net/jNWB8/ 然后我将其应用于我的验证 (此模式将在ng-repeat中使用),但我的表单验证已损坏。它在浏览器中已正确解

  • 问题内容: 我有一个关于使用JdbcTemplate进行动态查询的问题。 我的代码如下: 现在,我的问题是,我想要与插入查询中的自动生成问号相同数量的“值”。 现在,值变量考虑为一个字符串,因此,如果我有2个或更多问号,则在值变量中只有一个用逗号分隔的完整字符串,因此它不起作用。 见下面我的查询: 我想要如下: 问题答案: }

  • 我正在为spring批处理使用java配置(spring boot)。我有一个员工Id列表,对于每个Id,我需要运行一个查询(如下所示),然后处理数据。 我知道我们可以使用阅读器。setPreparedStatementSetter动态设置上述SQL中的参数。但是,我不确定如何对列表中的每个员工id重复批处理过程。即使我将reader()标记为@StepScope,也只会调用一次reader。(即

  • 有人能指出openNLP NameFinder模块使用的算法吗?代码很复杂,只有很少的文档记录,并且将其作为黑匣子(提供默认模型)使用给我的印象是它主要是启发式的。以下是一些输入和输出示例: 输入: 约翰·史密斯很沮丧。 约翰·史密斯很沮丧。 巴拉克·奥巴马感到沮丧。 乌戈·查韦斯很沮丧。(不再) 杰夫·阿特伍德很沮丧。 刘冰对openNLP NER模块感到失望。 诺姆·乔姆斯基对这个世界感到沮丧

  • 我目前正在从事一个java web服务器项目,该项目需要使用自然语言处理,特别是实体识别(Entity Recognition,NER)。 我在java中使用OpenNLP,因为添加自定义训练数据很容易。它工作得很好。 然而,我还需要能够提取实体内部的实体(嵌套命名实体识别)。我试着在OpenNLP中这样做,但我遇到了解析错误。所以我猜OpenNLP很遗憾不支持嵌套实体。 下面是一个我需要解析的示