【问题标题】:Filtering in query using JPA in java在java中使用JPA过滤查询
【发布时间】:2014-08-05 18:48:43
【问题描述】:

如何使用 openjpa 从数据库中获取基于 YEAR 的数据。我的数据库中有一个时间戳(RECEIPT_DATE)字段。现在我根据选定的年份从数据库中获取数据。 查询如下:

select contact_names from contact where YEAR(RECEIPT_DATE)='2014'.

这在数据库中完美运行。

和我在 JPA 中写的一样。

select contactNames from contact where year(receiptDate)='2014'.

但我得到一个错误,比如无法识别年份参数。 有什么方法可以让我使用 JPA 执行相同的查询,最好不要使用任何其他插件。请指导。

【问题讨论】:

  • @Jens:提到的链接没有可接受的答案,我已经尝试了那里的方法,这些方法似乎对我也不起作用(据说帖子提到使用 nativeQuery,但我问的是那里JPA 中的任何内置函数,而不是使用本机查询)。

标签: java sql jpa ejb


【解决方案1】:

您应该使用 JPA 标准 API 查询。它们具有提取日期年份的功能。这很有帮助,因为如果你犯了错误,你会在编译时而不是在运行时知道它。

【讨论】:

  • Criteria 没有提取年份等的特定功能(JPQL 也没有) - 标准与 JPQL 字符串形式完全相同。 JPA 2.1 在我的回答中添加了“FUNCTION”,可用于调用本机函数。
  • @Neil Stockton 也许我读错了,但在这个网站上:[link]objectdb.com/java/jpa/query/jpql/date 他们谈论用于提取标准查询中可用的日期和时间部分的功能。示例:cb.function("year", Integer.class, date);
  • 但是它不是getYear
  • 正如我所说,JPA 2.1 具有“功能”,这是基于 JPQL 字符串的查询的一部分,也是标准。这不是用户必须使用 Criteria 的理由,因为该方法不仅在此处可用……他可以将其放在他的字符串查询中。根据我的回答,“功能”完全是 RDBMS 特定的。
【解决方案2】:

JPA 没有 YEAR 功能,使用 JPA 您将使用 JPQL 而不是 SQL。

您可以改用 NativeQuery:

entityManager.createNativeQuery("select * name from person", RESULT_CLASS.class);

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html

【讨论】:

    【解决方案3】:

    JPA 2.1 具有FUNCTION(funcName, args),您可以将 FUNCTION 设置为 YEAR(或您的 RDBMS 支持的任何内容)。它没有针对日期组件的特定函数,因此您必须查找您的 RDBMS 使用的特定本机函数并将它们放入 JPA2.1 "FUNCTION"

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多