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

时间:2015-12-15 16:59:47

标签: 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();
}

我总是

  

在EntityManager中创建查询时发生异常:   例外描述:编译问题[SELECT D FROM DOSSIER d WHERE EXTRACT(年来自d.dateCreation)= 2015]。 [14,21]抽象模式类型&#39; DOSSIER&#39;不明。 [48,62]状态字段路径&d.dateCreation&#39;无法解析为有效类型。

我直接在数据库中测试它并且它可以正常工作

select * from dossier where extract(year from date_creation)=2015

我使用jpaejb以及jdeveloper作为IDE。

4 个答案:

答案 0 :(得分:1)

&#34;直接在数据库中&#34;叫做SQL。

createQuery接受JPQL而非SQL,而YEAR / EXTRACT是无效关键字(虽然YEAR,但不是EXTRACT,但某些JPA提供程序支持)。任何体面的JPA文档都会拼出来。

答案 1 :(得分:0)

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

  

抽象模式类型&#39; DOSSIER&#39;未知

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

另外,关于你提到的问题,据我所知,只有EclipseLink支持EXTRACT函数。通过错误消息,我认为这是您的JPA实现,但如果不是,则有两种选择:

  1. 如果你正在使用Hibernate,它会内置函数来检索日期部分,例如YEAR(date)MONTH(date)DAY(date)HOUR(date),{{ 1}}和MINUTE(date)
  2. 对于任何其他JPA实施,或者如果您希望保持JPQL兼容,您可以使用SECOND(date)SUBSTRING进行解决。注意the first position of a string is denoted by 1;
  3. 希望有所帮助

答案 2 :(得分:0)

谢谢你们,我解决了这个问题: 首先我获得当前年份而不是将其格式化为int而不是String,以便进行比较并在此处减去它,我的代码工作正常:

    public List<Dossier> getAllDossierParAn() {
    Date date = new Date();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    int strI = calendar.get(Calendar.YEAR);
   String strInt  =Integer.toString(strI);
    String nvlstri= strInt.substring(2, 4);
    TypedQuery<Dossier> query;
    query = em.createQuery("SELECT d FROM Dossier d WHERE SUBSTRING(d.dateCreation, 7, 2) = :vr", Dossier.class);
  query.setParameter("vr",nvlstri);
   System.out.println("l anne est " +strI);
   System.out.println("la date formaté " +nvlstri);
    return query.getResultList();
}

答案 3 :(得分:0)

在eclipselink上,对我有用的方式如下:

SELECT  a.id, EXTRACT(WEEK CURRENT_DATE ) FROM Account a

这至少适用于postgres和sql server,但也适用于其他受支持的数据库。

javadocs支持的语法是:

extract_expression ::= EXTRACT(date_part_literal [FROM] scalar_expression)

FROM似乎在sql server上引起了有趣的异常。