0

我遇到了有关休眠注释映射配置的问题。想象一下社交媒体平台上的以下两个课程:

@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 中的用户对象连接起来。这味道不对。所以我正在寻找一种解决方案,将这个聚合字段嵌入到我的基础实体中。我在哪里可以在 Hibernate 中指定自定义检索用户对象以添加这样的聚合字段?

您可以想象一个类似的问题,例如在 CRM 中嵌入特定客户的交易金额总和。

我希望,我可以说明我的想法和问题。提前致谢!

4

1 回答 1

0

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);
}
于 2015-11-13T12:53:53.593 回答