使用 jpql 和 jpa 从日期字段中提取年份

use*_*507 6 java jpa jpql

我想从数据库中的一行中提取年份部分,以便将其与值进行比较。

这是我的功能

public List<Dossier> getAllDossierParAn() {
    Date date = new Date();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    int strI = calendar.get(Calendar.YEAR);
    TypedQuery<Dossier> query;
    query = em.createQuery("SELECT d FROM DOSSIER d WHERE EXTRACT(YEAR ,d.dateCreation)=2015", Dossier.class);
    System.out.println(strI);
    return query.getResultList();
}
Run Code Online (Sandbox Code Playgroud)

我总是得到

在 EntityManager 中创建查询时发生异常:异常描述:编译 [SELECT d FROM DOSSIER d WHERE EXTRACT(YEAR FROM d.dateCreation)=2015] 时出现问题。[14, 21] 抽象模式类型“DOSSIER”未知。[48, 62] 状态字段路径“d.dateCreation”无法解析为有效类型。

我直接在数据库中测试,可以用

select * from dossier where extract(year from date_creation)=2015
Run Code Online (Sandbox Code Playgroud)

我正在使用jpaand作为ejbIDE jdeveloper

ren*_*nke 6

首先,您的查询的主要问题是错误消息的内容:

抽象模式类型“DOSSIER”未知

由于 JPA 将 POJO 映射为实体,因此它们的名称区分大小写。您的查询应该是: SELECT d FROM Dossier d WHERE ...

另外,关于你提到的问题,EXTRACT据我所知,该功能仅EclipseLink支持。根据错误消息,我认为这是您的 JPA 实现,但如果不是,有两种选择:

  1. 如果您使用 Hibernate,它具有用于检索日期部分的内置函数,例如YEAR(date)MONTH(date)DAY(date)HOUR(date)MINUTE(date)SECOND(date)
  2. 对于任何其他 JPA 实现,或者如果您想使其保持 JPQL 兼容,您可以使用SUBSTRING:来解决SUBSTRING(d.dateCreation, 1, 4)。注意字符串的第一个位置用 1 表示

希望能帮助到你


Nei*_*ton 1

“直接在数据库中”称为SQL。

createQuery接受 JPQL 而不是 SQL,并且 YEAR / EXTRACT 是无效关键字(尽管某些 JPA 提供程序支持 YEAR,但不支持 EXTRACT)。任何像样的 JPA 文档都会阐明这一点。