Java Hibernate-在实体中嵌入聚合列
我在hibernate注释映射配置方面遇到问题。想象一下,在社交媒体平台上有以下两个课程:Java Hibernate-在实体中嵌入聚合列,java,sql,hibernate,annotations,mappings,Java,Sql,Hibernate,Annotations,Mappings,我在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
@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;
}
我现在的问题是,如何将最新的帖子作为一个字段嵌入到它的映射用户中
新用户:
@Entity
class User {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany
private List<Post> posts;
//@Filter?
//@Query?
private Post latestPost;
}
我不想将“最新发布”聚合中的数据与Java中的用户对象连接起来。这味道不对。因此,我正在寻找一种解决方案,将这个聚合字段嵌入到我的基本实体中。我在哪里可以指定Hibernate中用户对象的自定义检索来添加这样一个聚合字段
您可以想象一个类似的问题,例如在CRM中嵌入特定客户的交易金额总和
我希望,我能说明我的想法和问题。提前谢谢 JPA本身不提供这样的注释 但是特定于Hibernate的Where注释正是您想要的。唯一的缺点是,它需要一个集合才能工作,您可以使用特定的getter解决这个问题:
@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);
}
是否可以在@Where子句中创建一个子select和join?怎么做?这是个好主意吗?我认为这是可能的——看看我的答案。我没有测试这个查询——可能是因为需要进行一些微调……如果我正好使用这个注释,Hibernate会创建并使用一个特定的表“user\u latest\u post”。这不是我期望发生的原因。好的,在这种情况下,设置mappedBy可能会有所帮助。
@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);
}