【问题标题】:Hibernate - Embedding an aggregated Column in Entity [duplicate]Hibernate - 在实体中嵌入聚合列[重复]
【发布时间】:2016-02-14 18:36:02
【问题描述】:

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

@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 中嵌入特定客户的交易金额总和。

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

【问题讨论】:

  • 是否可以创建子选择并加入@Where 子句?如何?这是个好主意吗?
  • 我认为这是可能的 - 请参阅我的答案。我没有测试查询 - 可能需要进行一些“微调”...

标签: java sql hibernate annotations mappings


【解决方案1】:

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

【讨论】:

  • 如果我完全使用这个注解,Hibernate 会创建并使用一个特定的表 'user_latest_post'。这不是我预期会发生的原因。
  • 好的,在这种情况下,设置mappedBy 会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 2020-08-16
  • 1970-01-01
  • 2014-03-29
  • 2014-03-15
相关资源
最近更新 更多