2015-11-13 53 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; 
} 

在我的用例中最有趣的信息是最新的帖子每一個用戶寫道。我可以在用戶讀取和附加自定義查詢就像這樣:

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; 
} 

我不想從我的「在Java中我的用戶對象的最新-post'聚集加入數據。這味道不對。所以我正在尋找一個解決方案來將這個聚合字段嵌入到我的基礎實體中。我在哪裏可以指定在Hibernate中的用戶對象的自定義檢索來添加這樣的聚合字段?

你可以想象一個類似的問題,例如,在CRM中嵌入特定客戶的交易金額。

我希望我能說明我的想法和問題。提前致謝!

+0

是否有可能創建一個子選擇並加入@ Where子句?如何?這是一個好主意嗎? –

+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

如果我完全使用這個Annotations,Hibernate會創建並使用一個特定的表'user_latest_post'。這不是我期望發生的原因。 –

+0

好的,在這種情況下,它可以幫助設置'mappedBy'。 –