web-dev-qa-db-ja.com

Hibernateで@Whereを使用する方法

数時間検索しましたが、JPAを使用したPlayFrameworkの学習曲線にとらわれています。投稿できるサンプルWebサイトを構築しています。ただし、これらの投稿には次の状態があります。

  • PostDraft(投稿は下書きであり、公開しません)
  • PostPublished(投稿を公開できます)

これらの状態は別のテーブルに格納されます。明らかに、ドラフト状態の投稿まだ表示されていないはずです。

だから私はこれらのクラスを持っています:

  • ページクラス(テーブルからページ情報を取得、1ページに複数の投稿を含めることができます)
  • 投稿クラス(投稿は下書きで公開できます)

私のページクラスで私は持っています:

@Column(name="POSTS_REF")
@Where(clause="PostPublished")
private List<Posts> userPosts;

しかし、これは機能していません!それで、JPQLを使用せずに発行済み状態の投稿のみをロードするために、where句をどのように指定できますか?

ありがとう!

更新:2011-10-11

テーブル:投稿カラム:-id-title-state_ref(States of the IDテーブルへの参照)-コンテンツ

テーブル:States列:-id-statename

だから私は次のようなことを言いたいです:

select * 
from posts inner join states on posts.state_ref = states.id
where states.statename = 'PostPublished'

2011年10月13日更新

これは私のページクラスでの現在の変更ですが、どちらも機能しません。

/** link to the states */
@JoinColumn(name = "STATES_REF")
@OneToOne
@Where(clause = "states.statename = 'PostPublished'")
public MyState state;

PDATE 2012-02-1結局、Emtの答えは私にとってうまくいきました。

14
adis

次のようなものを試してください:

@Column(name="POSTS_REF")
@Where(clause="state='PostPublished'")
private List<Posts> userPosts;

または

@Column(name="POSTS_REF")
@Where(clause="PostPublished=true")
private List<Posts> userPosts;

Postエンティティのステータスフィールドタイプによって異なります。

17
emt14

Where句は完全な条件でなければなりません-このようなものです。その状態が投稿のプロパティであると仮定します。

@Column(name="POSTS_REF")
@Where(clause="state = 'PostPublished'")
private List<Posts> userPosts;

[〜#〜]編集[〜#〜]

データモデルに基づいて-以下が機能するはずです。私はそれを使用することをお勧めしません。投稿コレクションをマップしないでください-POstsクラスからPageへの参照を持ち、DAOにメソッドを追加して、HQLまたは条件クエリを使用してページの公開投稿を取得します。

@Column(name="POSTS_REF")
@Where(clause="exists (select id from states where state_ref = states.id and states.statename = 'PostPublished')")
private List<Posts> userPosts;
2
gkamal

where条件には、データベース列名が含まれている必要があります。

@Where(clause="state = 'PostPublished'")

ここで、state列名はDBにあり、Hibernateマッピングにはありません。

0
Alex