【发布时间】:2016-03-28 16:16:20
【问题描述】:
我有一个event 表和一个eventData 表作为Map<> 与Hibernate 链接
事件 -> 地图 eventDatas
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name = "event_id", referencedColumnName = "event_id")
@MapKey(name = "idk.key")
public Map<DATA_KEY, eventData> getEventDatas() {
return eventDatas;
}
然后我有这个 QueryDSL 来获取按日期分组的 event 的聚合。
如果Map<> 包含一对DATA_KEY.CODE=202,则该组为"OK",否则,如果该对缺失或具有不同的值,则该组为"FAIL"。
final QEvent event = QEvent.event;
Expression<String> groupCase =
event.eventDatas.get(DATA_KEY.CODE).valueInt
.when(202).then("OK")
.otherwise("FAIL");
ConstructorExpression<StatDto> constructor =
Projections.constructor(StatDto.class, event.date, event.count(), groupCase);
query.select(constructor)
.from(event)
.leftJoin(event.eventDatas)
.groupBy(event.date, groupCase)
.orderBy(event.date.asc());
return query.fetch();
此查询返回错误:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: with near line 2, column 73
[select event.date, count(event), case when event_eventDatas_0.valeurInt = ?1 then 'OK' else 'FAIL' end
from event.eventDatas as event_eventDatas_0 with key(event_eventDatas_0) = ?2, entitystat.event event
left join event.eventDatas
group by event.date, case when event.eventDatas.get(?2).valeurInt = ?1 then 'OK' else 'FAIL' end
order by event.date]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836)
at com.querydsl.jpa.hibernate.DefaultSessionHolder.createQuery(DefaultSessionHolder.java:36)
at com.querydsl.jpa.hibernate.AbstractHibernateQuery.createQuery(AbstractHibernateQuery.java:104)
at com.querydsl.jpa.hibernate.AbstractHibernateQuery.createQuery(AbstractHibernateQuery.java:97)
at com.querydsl.jpa.hibernate.AbstractHibernateQuery.fetch(AbstractHibernateQuery.java:174)
查询中没有groupCase,错误消失,证明问题出在案例本身。
在聚合中使用 Map<> 的正确语法是什么?
附录:
错误将with 标记指向from 行:
from event.eventDatas as event_eventDatas_0 with key(event_eventDatas_0) = ?2
这是 Hibernate 生成的没有 groupCase 的 SQL:
select event0_.date as col_0_0_, count(event0_.event_id) as col_1_0_
from event event0_
group by event0_.date
order by event0_.date
【问题讨论】:
-
能否提供不带groupCase的生成SQL?谢谢!
-
@Bonifacio 我在问题末尾添加了 SQL。
-
问题解决了吗。
-
不,问题仍在继续。没有人找到正确的方法来正确地实现这一目标。
标签: java hibernate exception syntax querydsl