我想从数据库中的一行中提取年份部分,以便将其与值进行比较。
这是我的功能
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
我使用jpa
和ejb
以及jdeveloper
作为IDE。
答案 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实现,但如果不是,则有两种选择:
YEAR(date)
,MONTH(date)
,DAY(date)
,HOUR(date)
,{{ 1}}和MINUTE(date)
。SECOND(date)
:SUBSTRING
进行解决。注意the first position of a string is denoted by 1; 希望有所帮助
答案 2 :(得分:0)
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上引起了有趣的异常。