2015-12-15 97 views
1

我想从数据库中的一行中提取年份,以便将其与值进行比较。使用jpql和jpa从日期fileld中提取年份

这里是我的功能

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专题报道d,其中提取物(一年d.dateCreation)= 2015]。 [14,21]抽象模式类型'DOSSIER'是未知的。 [48,62]状态字段路径“d.dateCreation”无法解析为有效类型。

我直接在数据库中进行测试,它工作

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

我使用jpaejbjdeveloper为IDE。

回答

0

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

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

0

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

的抽象模式类型“档案”未知

由于JPA是映射你的POJO的实体,其名称区分大小写。你的查询应该是: SELECT d FROM Dossier d WHERE ...

另外,关于你提到的问题,EXTRACT函数只支持EclipseLink,据我所知。该错误消息,我觉得这是你的JPA实现,但如果没有的话,有两种选择:

  1. 如果您在使用Hibernate,它内置了用于检索日期部分功能,如, MONTH(date),DAY(date),HOUR(date),MINUTE(date)SECOND(date)
  2. 对于任何其他JPA实现,或者如果您想保持JPQL兼容,您可以使用SUBSTRINGSUBSTRING(d.dateCreation, 1, 4)解决方法。备注the first position of a string is denoted by 1;

希望它可以帮助

+0

关于将DATE传递到SUBSTRING中没有任何“JPQL兼容”。 SUBSTRING仅适用于字符串或算术表达式。 –

+0

这是,如果你想它与任何实现兼容。 – renke

+0

Errm,你似乎没有阅读我的评论。 SUBSTRING只能在标准化的JPQL中接受字符串或算术表达式。 DATE既不是。 –

0

感谢你们我解决了这个问题: 首先我拿到了当年比格式化为int,而不是字符串,以做comparaison和。减去在这里是我的代码它的工作精细:

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(); 
} 
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上的搞笑异常。

相关问题