【问题标题】:Complex JPQL ORDER statement复杂的 JPQL ORDER 语句
【发布时间】:2011-06-23 19:37:22
【问题描述】:

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

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 被简单地忽略了。

建议?

【问题讨论】:

  • 您的实体是如何映射的?

标签: mysql jpa jpql


【解决方案1】:

所以,首先感谢评论的发帖人,询问我的实体关系。这迫使我更仔细地审视事情并意识到出了什么问题。

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

AND 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 类中的这种关系更改为实际转到一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多