1

私がやろうとしていることについての簡単な説明。

Content(contentId、body、timeofcreation)、ContentAttachmentMap(contentId、attachmentId)、Attachment(attachmentId、resourceLocation)の3つのテーブルがあります。

将来のアプリケーションで添付ファイルを別のコンテンツと共有することもできるため、マッピングテーブルの作成を採用した理由。

現在、HQLを使用してデータを取得しています。私の目的は次のとおりです。

  1. 添付ファイル付き/なしのすべてのコンテンツを取得

目的固有のクラス(POJOではない)を作成し、コンストラクター内のselectステートメントから属性名を配置すると、そのクラスオブジェクトのリストが返されるなど、インターネットでいくつかの例を見てきました。

たとえば、HQLはSELECT new com.mydomain.myclass(cont.id, cont.body).....などになります。

SELECT new com.mydomain.contentClass(cont.id, cont.body, List<Attachment>私の場合、私は次の)FROM...`を探しています。はい、resultListにcontentid、contentbody、およびその添付ファイルのリストを単一の結果リストアイテムとして含めたいと思います。添付ファイルがない場合は、(cont.id、contentbody、null)が返されます。

これは可能ですか?また、SQLステートメントの書き方も教えてください。

前もって感謝します。

4

1 に答える 1

2

根本的に間違った方法で Hibernate を使用していると思います。基になるテーブルを公開するために使用するのではなく、Hibernate を使用してドメイン エンティティを表示する必要があります。

contentClassこれらすべてに対して特別な値オブジェクトを用意する必要はありません。Content エンティティを選択するだけで、必要なものが提供されます。

実際の例があるとわかりやすいと思います。

アプリケーションでは、「3 つのテーブル」として表示されません。次のような 2 つのエンティティとして表示されるはずです。

@Entity
public class Content {
  @Id
  Long id;

  @Column(...)
  String content;

  @ManyToMany
  @JoinTable(name="ContentAttachmentMap")
  List<Attachment> attachments;
}

@Entity
public class Attachment {
  @Id
  Long id;

  @Column(...)
  String resourceLocation
}

そして、あなたが探している結果は、単純に次のような HQL の結果です。

from Content where attachments IS EMPTY

DB アクセスを節約するために、fetch にも参加できると思います。

from Content c left join fetch c.attachments where c.attachments IS EMPTY

于 2013-01-22T07:08:10.530 に答える