Hibernate HQL: предложение where со списком - PullRequest
2 голосов
/ 27 января 2011

Я немного запутался с Hibernate. Моя проблема заключается в следующем:

У меня есть объект в таблице в моей базе данных, и этот объект связан с другими комментариями (хранится в другой таблице)

В HQL я хочу выбрать эти объекты в моей таблице, но только если последний комментарий, связанный с объектом, имеет определенный статус (последний комментарий - это тот, который имеет самый высокий идентификатор). Один комментарий связан только с одним объектом.

Этот запрос отлично работает :

    select distinct myObject from org.MyClass myInstance
    join myObject.comments comment
    where comment.status in (:theListOfStatusThatIWant)

Но этот запрос не выполняет то, что я хочу ...

Я пробовал это:

     select distinct myObject from org.MyClass myInstance
     join myObject.comments comment
     where comment.status in (:theListOfStatusThatIWant)
     order by comment.id desc

Но без успеха ... (запрос работает нормально, но не делает то, что я хочу)

Кто-нибудь может мне помочь?

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Вам нужно выразить тот факт, что вы хотите последний комментарий, примерно так:

select distinct myObject from org.MyClass myInstance
join myObject.comments comment
where comment.status in (:theListOfStatusThatIWant)
and comment.id = 
    (select max(c1.id) from Comment c1 where c1 member of myObject.comments)
0 голосов
/ 27 января 2011

Одна из первых мыслей в вашем запросе - изменить то, к чему вы обращаетесь.В псевдо-HQL:

select c.objectYouReallyWant from Comment c where c.status = ? order by c.id desc

Затем вы можете установить maxResults (я думаю, что это зависит от базы данных), чтобы получить только одну строку назад.К сожалению, это вернет только последний комментарий с правильным статусом.Если вы хотите получить последний комментарий, независимо от статуса, вам нужно сбросить ограничение статуса.

Предел (он же максимальный результат) должен быть дешевле в исполнении, чем подвыбор, чтобы найти максимумконкретный ряд), но, конечно, вам нужно проверить это.

...