0

休止状態の注釈マッピング構成に関して問題があります。ソーシャル メディア プラットフォームに次の 2 つのクラスがあるとします。

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

「latest-post」集計のデータを Java のユーザー オブジェクトと結合したくありません。これは味がしません。したがって、この集約されたフィールドをベースエンティティに埋め込むソリューションを探しています。このような集約されたフィールドを追加するために、Hibernate でユーザー オブジェクトのカスタム取得をどこで指定できますか?

たとえば、CRM に埋め込まれた特定の顧客の取引金額の合計など、同様の問題を想像することができます。

私の考えと問題を説明できれば幸いです。前もって感謝します!

4

1 に答える 1

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