Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-在实体中嵌入聚合列_Java_Sql_Hibernate_Annotations_Mappings - Fatal编程技术网

Java 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

我在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;
}
我现在的问题是,如何将最新的帖子作为一个字段嵌入到它的映射用户中

新用户:

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