Сложный оператор JPQL ORDER - PullRequest
       19

Сложный оператор JPQL ORDER

0 голосов
/ 09 февраля 2011

Я пытаюсь написать довольно сложный оператор 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 просто игнорируется.

Предложения?

1 Ответ

0 голосов
/ 09 февраля 2011

Итак, во-первых, спасибо постеру, который прокомментировал, спрашивая о моих отношениях сущностей.Это заставило меня поближе взглянуть на вещи и понять, что было не так.

Как оказалось, когда я был еще хуже в 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, чтобы фактически перейти к объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...