2011-09-01 159 views
13

我们使用JPA与Hibernate作为供应商, 我们有包含在子查询FROM子句联接,但我们得到以下错误的查询:JPA /休眠子查询中from子句

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: (near line 1, column 75 [SELECT sd FROM com.hp.amber.datamodel.entities.analysis.SnapshotDates sd, (SELECT max(x.changeDate) maxChangeDate, x.viewId, x.state FROM com.hp.amber.datamodel.entities.analysis.SnapshotDates x WHERE x.changeDate<:date AND x.viewId in (:viewIds) AND x.state=:state GROUP BY x.viewId, x.state) sd2 WHERE sd.viewId = sd2.viewId AND sd.state = :state AND sd.changeDate = sd2.maxChangeDate]

这是查询:

SELECT sd 
FROM SnapshotDates sd, 
    (SELECT max(x.changeDate) maxChangeDate, x.viewId, x.state 
     FROM SnapshotDates x 
    WHERE x.changeDate<:date AND x.viewId in (:viewIds) AND x.state=:state 
GROUP BY x.viewId, x.state) sd2 
WHERE sd.viewId = sd2.viewId 
     AND sd.state = :state 
     AND sd.changeDate = sd2.maxChangeDate 

谢谢你帮

回答

2

你的SQL是:

SELECT sd FROM SnapshotDates sd, (SELECT max(x.changeDate) maxChangeDate, x.viewId, x.state FROM SnapshotDates x WHERE x.changeDate<:date AND x.viewId in (:viewIds) AND x.state=:state GROUP BY x.viewId, x.state) sd2 WHERE sd.viewId = sd2.viewId AND sd.state = :state AND sd.changeDate = sd2.maxChangeDate

你可以重写你的SQL像

SELECT sd 
FROM SnapshotDates sd, 
WHERE sd.viewId in (:viewIds) 
    AND sd.state = :state 
    sd.changeDate = (SELECT max(x.changeDate) FROM SnapshotDates x WHERE x.viewId = ds.viewId AND x.state = ds.state) 

查找例如

SELECT m FROM Professor m WHERE (SELECT COUNT(e) FROM Professor e WHERE e.manager = m) > 0 

http://www.java2s.com/Code/Java/JPA/EJBQLWhereClauseWithSubQuery.htm

我的灵感相似例如 我有SQL

select k.* from kredits k, 
    (select client_id, max(r_date) r_date from kredits k group by client_id) k2 
where k.client_id = k2.client_id 
    AND k.r_date = k2.r_date 
order by k.id 

改写为PQL

select k From Kredit k 
where k.rDate = (select MAX(k2.rDate) from Kredit k2 where k2.clientId = k.clientId) 
order by k.id 

它将会被翻译成

select kredit0_.id as id28_, kredit0_.client_id as client59_28_ from kredits kredit0_ 
where kredit0_.r_date=(select MAX(kredit1_.r_date) from kredits kredit1_ where kredit1_.client_id=kredit0_.client_id) 
order by kredit0_.id 

返回相同的结果,SQL。

使用Hebirnate 3.3.1与MySQL 5.0.24