2011-02-08 147 views
0

我想写一个相当复杂的JPQL语句,它根据另一个表中的值对结果进行排序。我知道MySQL会是什么样子,但我需要帮助将它变成JPQL。这是等效的SQL:复杂的JPQL ORDER语句

SELECT o.* FROM Observation o 
LEFT JOIN Obs_Event p 
ON p.Event_ID = o.Event_ID 
LEFT JOIN Event_Set ppp 
ON ppp.Event_ID = o.Event_ID AND ppp.Event_Set_ID = o.Event_Set_ID 
WHERE o.Individual_ID = <some id> 
AND o.Observation_Date = <a date value> 
ORDER BY ppp.Seq_Num ASC 

任何关于如何做到这一点的帮助将不胜感激。具体来说,我似乎有这个部分的麻烦:

ON ppp.Event_ID = o.Event_ID AND ppp.Event_Set_ID = o.Event_Set_ID 

所以,到目前为止,我已经试过这样:

 Query q= em.createQuery("select o " + 
       " from Observation as o " + 
       " join o.eventID p" + 
       " join p.eventSetCollection ppp " + 
       " where o.individualID = :indiv " + 
       " AND o.observationDate = :d " + 
       " AND o.eventID = ppp.event " + 
       ""; 

如果我尝试添加像

WHERE ... 
AND o.eventSetID = ppp.eventSet 

...它根本不起作用。如果我查看生成的SQL,它看起来像ppp.eventSet被忽略。

对此提出建议?

+0

您的实体如何映射? – axtavt 2011-02-09 10:22:56

回答

0

所以,首先感谢评论的海报,要求我的实体关系。这迫使我仔细观察事物并意识到出了什么问题。

事实证明,当我在JPA比现在更糟的时候,我将o.eventID属性设置为一个实际的Integer,就像记录/对象的主键一样,而不是实际的对象。因此,在上面的JPQL,我实际上是想在下面的语句的对象映射到一个整数:

和o.eventID = ppp.event

原来,正确的说法是:

 Query q= em.createQuery("select o " + 
       " from Observation as o " + 
       " join o.eventID p" + 
       " join p.eventSetCollection ppp " + 
       " where o.individualID = :indiv " + 
       " AND o.observationDate = :d " + 
       " AND o.eventID= ppp.event.eventID" + 
       " order by ppp.seqNum ASC" + 
       ""); 

虽然我最终应该在Observation类中更改这种关系,以便实际转到对象,但这种方式在捏合中起作用。