2015-11-13 4 views
1

У меня возникла проблема с конфигурациями сопоставления аннотаций спящего режима. Представьте себе следующие два класса на социальной медиа-платформы:Hibernate - встраивание агрегированной колонки в объект

@Entity 
class User { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private String name; 

    @OneToMany 
    private List<Post> posts; //lazy-loaded, because of big amounts 
} 

@Entity 
class Post { 
    @Id 
    @GeneratedValue 
    private Long id; 

    //large amounts of data 
    private String text; 

    private Date date; 

    @ManyToOne 
    private User author; 
} 

Самая интересная информация в моем Прецедент является самым последним Post писал каждый пользователь. Я мог читать в пользователей и добавлять пользовательский запрос так же, как это:

SELECT mx.userId,text,mx.date FROM 
    (SELECT user.id AS userId,max(date) AS date 
    FROM post,user 
    WHERE post.author=user.id 
    GROUP BY user.id) mx, 
    Post p 
WHERE p.author=mx.userId 
    AND p.date=mx.date; 

Мой вопрос теперь в том, как я могу вставить последнее сообщение в отображенной пользователем в поле.

Новый пользователь:

@Entity 
class User { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private String name; 

    @OneToMany 
    private List<Post> posts; 

    //@Filter? 
    //@Query? 
    private Post latestPost; 
} 

Я не хочу, чтобы присоединиться данные от моего «последнего post'-агрегации с моим User-объектов в Java. Это не кажется правильным. Поэтому я ищу решение для внедрения этого агрегированного поля в мой базовый объект. Где можно указать пользовательский поиск пользовательских объектов в спящем режиме, чтобы добавить такое агрегированное поле?

Вы можете представить себе аналогичную проблему, например. встроенные суммы торговых сумм конкретного клиента в CRM.

Надеюсь, я мог бы проиллюстрировать свои мысли и проблемы. Заранее спасибо!

+0

Можно ли OT создать подзапрос и присоединиться к @ Где-п? И как? Это хорошая идея? –

+0

Я бы подумал, что это возможно - см. Мой ответ. Я не тестировал запрос - возможно, существует необходимость в «финализации» ... –

ответ

0

Сам JPA не предоставляет такую ​​аннотацию.

Но Hibernate конкретно Where аннотация делает именно то, что вы хотите. Единственный недостаток - он нуждается в коллекции работы, которые вы можете обойти с конкретным добытчиком:

@OneToMany(mappedBy = "author") 
@Where("date = (SELECT max(post.date) FROM post GROUP BY post.author)") 
private Collection<Post> latestPost; 

public Post getLatestPost() { 
    return latestPost.isEmpty() ? null : latestPost.iterator().next(0); 
} 
+0

Если я использую именно эти аннотации, Hibernate создает и использует определенную таблицу user_latest_post. Это не то, что я ожидал. –

+0

Хорошо, в этом случае это могло бы помочь установить 'mappedBy'. –

 Смежные вопросы

  • Нет связанных вопросов^_^