2015-07-02 2 views
1

У меня есть QueryDSL JPAQuery, который должен группироваться по календарной неделе. Я получаю исключение при вызове списка (...) на нем. Пока я заменяю все вхождения yearWeek() по году(), он отлично работает.IllegalStateException при группировке по годуWeek или неделя

код Java:

QCrmContact qCrmContact = QCrmContact.crmContact; 
BooleanExpression whereClause = qCrmContact.beUserId.eq(beUserId).and(qCrmContact.crmContactTypeId.in(contactTypeIds)); 

JPAQuery query = new JPAQuery(entityManager); 

query.from(qCrmContact).where(whereClause).orderBy(qCrmContact.createdDatetime.yearWeek().asc()) 
    .groupBy(qCrmContact.createdDatetime.yearWeek(), qCrmContact.crmContactTypeId); 
List<Tuple> rows = query.list(qCrmContact.createdDatetime.yearWeek(), qCrmContact.crmContactTypeId, qCrmContact.companyId.countDistinct()); 

Исключение:

Exception occurred during processing request: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
+-[METHOD_CALL] MethodNode: '(' 
| +-[METHOD_NAME] IdentNode: 'yearweek' {originalText=yearweek} 
| \-[EXPR_LIST] SqlNode: 'exprList' 
|  \-[DOT] DotNode: 'crmcontact0_.CREATED_DATETIME' {propertyName=createdDatetime,dereferenceType=ALL,propertyPath=createdDatetime,path=crmContact.createdDatetime,tableAlias=crmcontact0_,className=de.xxx.cxlbackend.database.model.CrmContact,classAlias=crmContact} 
|  +-[ALIAS_REF] IdentNode: 'crmcontact0_.ID' {alias=crmContact, className=de.xxx.cxlbackend.database.model.CrmContact, tableAlias=crmcontact0_} 
|  \-[IDENT] IdentNode: 'createdDatetime' {originalText=createdDatetime} 

java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
+-[METHOD_CALL] MethodNode: '(' 
| +-[METHOD_NAME] IdentNode: 'yearweek' {originalText=yearweek} 
| \-[EXPR_LIST] SqlNode: 'exprList' 
|  \-[DOT] DotNode: 'crmcontact0_.CREATED_DATETIME' {propertyName=createdDatetime,dereferenceType=ALL,propertyPath=createdDatetime,path=crmContact.createdDatetime,tableAlias=crmcontact0_,className=de.xxx.cxlbackend.database.model.CrmContact,classAlias=crmContact} 
|  +-[ALIAS_REF] IdentNode: 'crmcontact0_.ID' {alias=crmContact, className=de.xxx.cxlbackend.database.model.CrmContact, tableAlias=crmcontact0_} 
|  \-[IDENT] IdentNode: 'createdDatetime' {originalText=createdDatetime} 

Было бы хорошо для меня, чтобы использовать некоторые хак и передать родной SQL в Oracle:

to_char(CREATED_DATETIME, 'IW.YYYY') 

ответ

0

Разрешен путем замены

qCrmContact.createdDatetime.yearWeek() 

с

StringExpression createdWeekYear = StringTemplate.create("to_char(CREATED_DATETIME, 'IW.YYYY')");