2011-08-23 3 views
2

私はプレイして休止状態になり、プロジェクトに取り組んでいます。私はこれまでのところそれが大好き!Play、MySQL、およびHibernateを使用してManyToManyテーブルをカスタムクエリする方法はありますか?

最近新しい問題が発生しました。私は人のテーブルを持っています。私はそのクラス内にManyToMany関係を持っています。だから、Hibernateはそのテーブルをうまく作成し、私はpeopleid1とpeopleid2を持ち、人々はあらゆる種類の他の人と人間関係を持つことができます。

これで、そのテーブルで複雑なクエリを実行する必要があります。私はそれを自分のクラスにしたいと思っていますが、それが最善の方法であるかどうか、または休止状態を使用しているかどうかはわかりません。 JPQLは答えですか?どんな助けや考えもありがとう!

例として、いとこを使用しましょう。私にはクラス/モデルPersonがあり、これらの人々はいとこを持ち、いとこになることができます。今すぐ私のコードでこれを持っています:

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "Cousins", 
    joinColumns = { @JoinColumn(name = "personid") }, 
    inverseJoinColumns = { @JoinColumn(name = "cousinid") }) 
public Set<User> cousins; 

これは素晴らしい作品であり、接合テーブルを完全に作成して、データを入力することができます。しかし、私は機能を記述しようとしている。私はログインした人がいとこを持っているが、ログインしているユーザーがいとこである場合は誰も見つけることができないすべての人々を見つけることができます。これは正しい方法だと思いますが、Cousinsを自分のクラス/モデルにするのは非常に気に入っています。そうしたときには動作しますが、Hibernateがその関係をどのように管理するかはわかりません。

+0

何が質問ですか? JPQLがHibernateでリクエストを実行する方法であることを尋ねているなら、答えはYesです。結合テーブルをエンティティとしてマップする必要があるかどうかを確認する場合は、答えは「いいえ」です。休止状態のリファレンスドキュメントを読んでください:それは説明されています。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional –

答えて

1

いとこ関係は、それが純粋に対称だbecaueビット奇妙である:AはBのいとこである場合、Bはまた、これは古典的な学生コースの関係、それぞれ異なるA.

のいとこであります関係の側には異なる役割があります。

しかし、いとこの関係をroleA-roleB関係と考える必要があります。あなたは人といとこの人物として定義することができます。その人物を指しています。いとこは、いとこを指しています。だから、あなたがAという人がいとこBを持っていると言いたいのであれば、あなたは結合テーブルにタプルを持っていなければなりません。また、人BがいとこAを持っていると言いたい場合は、結合テーブルにタプルを付ける必要があります。人のすべてのいとこを見つけるためのHQLは、従って、以下れる

select cousin from People person inner join person.cousins cousin where person.id = :personId 

HQLいとこのすべての人を見つけるためには、このいずれかになります。

select person from People person inner join person.cousins cousin where cousin.id = :cousinId 

は用語で考えますテーブルの役割ではなく役割の役割を果たし、より簡単になります。親としてのいとこと人の考えは、おそらく良い考えです。なぜなら、それは協会を非対称にして役割をより明白にするからです。

+0

ご説明いただきありがとうございます。 – user908360

関連する問題