2012-04-09 5 views
0

私はHibernateを初めて使うことになります。私は2時間のためにgoogledをしたが、私はまだ把握することができない、HQLを使わずにJOINを作る方法、基準によってのみ。私はテーブルクライアント(cID、名前)と訪問数(vID、vcID、日付)を持っています。関係は1対多である(1クライアントは複数回訪問することができる)。私もsetFetchModeなしでそれをやりたいジャストクライテリア。 mappping xmlを変更する必要がありますか?条件付きで参加する

UPDATE: が、これは私のマッピングXMLの一部です:

ご訪問・エンティティへのマッピングですリスト属性「訪問」とクラスのクライアントを持つ
<class name="Client" table="Clients"> 
    <id name="cID" column="cID"><generator class="native"/></id> 
    <property name="name"  length="10" not-null="true"/> 
</class> 
<class name="Visit" table="Visits"> 
    <id name="vID" column="vID"><generator class="native"/></id> 
    <property name="vcID"  length="10" not-null="true"/> 
    <property name="date" length="25" not-null="true"/> 
</class> 
+0

あなたの現在のマッピングは何ですか?また、どのようにクエリを作成しようとしていますか?情報が不十分です。 –

答えて

1

あなたはあなたのマッピングを更新する必要があります。

<class name="Client" table="Clients"> 
    <id name="cID" column="cID"><generator class="native"/></id> 
    <property name="name"  length="10" not-null="true"/> 
    <!-- Declare Set<Visit> visits in the Client class--> 
    <set name="visits" lazy="false" cascade="all"> 
     <key column="vcID"/> 
     <one-to-many class="your.package.Visit"/> 
    </set> 
</class> 
<class name="Visit" table="Visits"> 
    <id name="vID" column="vID"><generator class="native"/></id> 
    <!-- and add "Client client" property to your Visit class --> 
    <many-to-one name="client" column="vcID" lazy="false"/> 
    <property name="date" length="25" not-null="true"/> 
</class> 

その後:

Criteria criteria = session.createCriteria(Visit.class).addCriteria("client") 
         .add(Restriction.eq(...)); 

または

Criteria criteria = session.createCriteria(Client.class).addCriteria("visits") 
         .add(Restriction.eq(...)); 

そして、Hibernateが自動的にそれらを結合します。

+0

多くのありがとう、ついにそれは動作します! – user1091733

3

Criteria criteria = session.createCriteria(Client.class); 
criteria.addCriteria("visits"); 

このあなたのクライアントテーブルと訪問テーブルの間の内部結合を作成します。あなたには、いくつかの良い例を見つけることができます。ここ

更新http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-associations

マッピングの例私はめったにしかし、それはに似読むべき、マッピングXMLを休止状態使用

<class name="Client" table="Clients"> 
     <id name="cID" column="cID"><generator class="native"/></id> 
     <property name="name"  length="10" not-null="true"/> 

     <bag name="visits"> 
      <key column="vcId"/> 
      <one-to-many class="Visit"/> 
     </bag> 
    </class> 

Tell Hiber 1対多の関係を表すプロパティ「訪問数」があることを示します。

+0

しかし、特別なリスト属性の「訪問」なしでこれを解決するにはどうすればよいですか?私は "SELECT name from Clients JOIN Visits on vcID = cID"と同等のものを探しています。最初の投稿では、私はマッピングXMLを入れました。私はそこに何か変えるべきでしょうか? – user1091733

+0

はい、Clientクラスには、Visitsクラス、espへのコレクションマッピングが必要です。 1-nの関係を定義するには、[link](http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html#collections-mapping) – PepperBob

+0

を参照してください。プライベートリスト訪問=新しいArrayList();)、マッピングXMLに何を追加する必要がありますか?その文書は私にとってはあまり明確ではありません。 – user1091733

関連する問題