2011-02-10 11 views
3

私はビジネスとエリアという2つのエンティティを持っています。休止状態2つのテーブルに左に残る

関連特性:
ビジネス - 地域、AREA2、コード
エリア - エリアID、AREANAME

エリアとビジネスマップのAREA2 IDとエリア内

私は、Hibernateを書くしようとしていますビジネスだけのすべての領域を返す基準。

SQLは次のようになります。エリアから LEFT OUTER a.areaId = b.areaまたはa.areaId = b.area2 WHERE a.areaName

BY b.code = nullを GROUP にビジネスbを登録しよう!

これは私が持っているものです。

DetachedCriteria criteria = DetachedCriteria.forClass(Business.class) 
.setProjection(Property.forName("area")) 
.setProjection(Property.forName("area2")) 
.add(Restrictions.ne("code", null)); 

Criteria criteriaArea = fullTextSession.createCriteria(Area.class) 
.createAlias("areaId", "areaId", CriteriaSpecification.LEFT_JOIN) 
.add(Property.forName("areaId").in(criteria)); 

しかし、これは動作しません、私は「ありません関連:エリアID」を取得クエリの例外を。

なぜこれが起こっているすべてのアイデア?ありがとう。

+1

小さなヒント:Restrictions.isNotNull( "コード")を使用します。一部のデータベースでは、 "<> null"は "is not null"とは異なります。 –

+0

関係をエンティティ定義に入れましたか?(xmlまたは注釈) – Reddy

答えて

5

createAlias()は、提供されたプロパティを使用して別のエンティティを結合します。 Hibernateは、提供されたプロパティのマッピングを使用して、結合するテーブルを計算します。しかしareaIdは、ビジネスエンティティへの参照として@ManyToOneまたは@ManyToManyとしてマップされていません。したがって、HibernateはArea.areaIdを使用して結合したいテーブルを理解していません。あなたは未使用に参加せずにクエリを書き直すこと

select a.* from Area a 
left join <here should be table referenced by areaId> b on a.areaId = b.id 
where a.areaId in (
    select area, area2 from Business where code <> null 
) 

あなたの基準がようなSQLに変換されます

DetachedCriteria criteria1 = DetachedCriteria.forClass(Business.class) 
.setProjection(Property.forName("area")); 

DetachedCriteria criteria2 = DetachedCriteria.forClass(Business.class) 
.setProjection(Property.forName("area2")); 

Criteria criteriaArea = fullTextSession.createCriteria(Area.class) 
.add(Restrictions.or(
    Property.forName("areaId").in(criteria1), 
    Property.forName("areaId").in(criteria2) 
);