0

バックグラウンド

id、imageId、propertyId列のテーブルがあります。

単一のプロパティに関連付けられた多くの画像が存在する可能性があり、単一の画像に関連付けられた多くのプロパティが存在する可能性があります。

imageId - many-to-many - propertyId

propertyIdのリストがあり、 Hibernateを使用してすべてのpropertyIdに関連付けられているすべての画像を調べたいと思います。

問題。

ちょうど今、一度に1つのプロパティを選択し、Criteria APIを使用して、このpropertyIdに関連付けられているすべてのimageIdを検索し、imageIdのリストを取得します。次のクエリでこのimageIdのリストを使用して、

select imageIds where imageId in (imageIds obtained in previous step) where propertyId = x

したがって、事実上、DBにヒットするクエリの数はpropertyIdの数と等しくなります。これは良い解決策ではないと思います。データベースにn回アクセスする必要があり、Detached Queryを使用してみましたが、成功しませんでした。より良い解決策はありますか?

また、最終的にimageIdのリストを取得したとき、それをユーザーセッションに保存してページ分割することをお勧めします(結果の数を考慮しないでください)。または、プロセス全体を繰り返すことをお勧めします。ページネーションの目的ですべてDBに保存することを検討しますか?

4

2 に答える 2

2

データベーススキーマの問題は次のとおりです。

3つの個別の関連付け(画像-コレクション、画像-プロパティ、コレクション-プロパティ)を単一のImageCollectionテーブルに詰め込もうとしています。これは良いことではありません。プレーンSQLを使用してこれを回避できる可能性がありますが(そのテーブルにnull列を持つ行がたくさんあるという犠牲を払って)、Hibernateでこれを適切にマップすることはできません。ところで、このテーブルには代理主キーは必要ありません。

あなたがする必要があるのは、それを3つの別々のテーブルに分割し、Hibernateでモデルを適切な多対多としてマップすることです。例えば:

@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}

IMAGE_PROPERTIESテーブルには列のみが含まIMAGE_IDれます。PROPERTY_IDあなたもそれと同じようにテーブルCOLLECTION_IMAGESを持っているでしょう。COLLECTION_PROPERTIES

これで、次のようなプロパティ名で画像をクエリできるようになります。

from Image img
  left join img.properties as prop
  with prop.name in ('Tag1', 'Tag2', 'Tag3')

プロパティが本当にタグに似ている場合は、AND / OR/UNIONクエリの例についてこの記事を参照してください。

プロパティが実際にプロパティである場合(つまり、所有者エンティティのライフサイクルがあり、一度に複数のエンティティに属することができない場合)、それらを2つのテーブル(画像用とコレクション用)に分割し、1つを使用することを検討してください- to-manyアソシエーション。そうすれば、上からのテーブルは必要IMAGE_PROPERTIESありません。COLLECTION_PROPERTIES

于 2009-09-22T17:04:28.310 に答える
0

したがって、次のようなクラスがあります(注:これはideで記述していないため、コードが構文的に正しくない可能性があります):

public class Property {
@ManyToMany
private List<Image> images;
}

public class Image {
@ManyToMany
private List<Property> properties;
}

したがって、のようなクエリを実行するselect property from Property propertyと、プロパティのリストが取得されます。これは、通常のJavaプロパティを介して取得できます。

それはあなたが探しているものですか、それとも私は質問を誤解しましたか?

于 2009-09-21T18:05:21.737 に答える