2015-12-15 104 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上的搞笑異常。

相關問題