Отображение Hibernate один-к-одному на основе отношения многие-к-одному с применением MAX (дата) - PullRequest
2 голосов
/ 21 июня 2011

У меня есть сопоставленный Message объект, который имеет отношения родитель-потомок с самим собой.Таким образом, каждый Message содержит Set<Message> comments.Помимо комментариев, я хотел бы установить отношение один-к-одному с последним сделанным комментарием, чтобы я мог использовать последний комментарий в своем Criteria.В SQL я устанавливаю это следующим образом (ни один комментарий не может иметь такой же postDate, так что это не приводит к двойным совпадениям для меня):

SELECT 
    parentM.*, 
    lastComment.* 
FROM 
    messages parentM 
    left outer join messages lastComment ON 
        lastComment.parentId=parentM.messageId AND 
        lastComment.postDate=(SELECT MAX(subM.postDate) FROM messages subM WHERE subM.parentId = parentM.messageId); 

Теперь я хотел бы знать, как настроить это в HibernateXML сопоставления, но я не уверен, как использовать свойство формулы или если я должен использовать другой механизм.Я надеялся, что следующее сработает, но это не сработает.

<one-to-one name="latestComment"  
    class="Message"  
    cascade="none"
    property-ref="parent"
    formula="postDate=(MAX(allComments.postDate) FROM messages allComments WHERE allComments.parentId=id)" 
    lazy="proxy">
</one-to-one>

С этим отображением я получаю желаемый результат, пока есть только один комментарий.Но форумла полностью игнорируется.Кажется, что во всех примерах используются простые формулы, просто отображающие другой столбец, а не подзапрос.

Ожидание некоторых указателей

Ответы [ 2 ]

1 голос
/ 21 июня 2011

формула - это выражение SQL, а не HQL, поэтому ваша формула в выражении не будет работать.

Что я делаю в этих ситуациях, так это перебираю коллекцию, чтобы найти нужную целевую сущность.В противном случае вы увеличиваете сложность запросов, чтобы гидрировать объект без реальной ценности.

Вы уже получаете самый последний комментарий, зачем заставлять его быть выбранным дважды?

1 голос
/ 21 июня 2011

Я мог бы быть полностью здесь не так (пожалуйста, извините, если я есть), но я не могу избавиться от ощущения, что сценарий, который вы пытаетесь обработать, может быть лучше обработан триггерной процедурой в базе данных , Позвольте самому механизму базы данных обрабатывать обновление указателя на «самый последний» комментарий. Таким образом, у вас нет потенциально дорогой функции MAX - вы просто посмотрите на postDate для этого комментария.

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