2011-01-13 7 views
1

私はHibernateの基準APIを使用してサブクエリを実行しようとしているが、それについて移動する完全にどのように把握することができていないのです。 SHOPSとEMPLOYEESの2つのテーブルがあると仮定すると、SHOPSはすべての店舗情報を持ち、EMPLOYEESはすべての店舗のすべての雇用者の大きなテーブルです(外部キーは設定されていません)。私はSHOPSテーブルから店のIDと住所を取得し、EMPLOYEESテーブルのジョインとカウントでショップ内の雇用数を検索するクエリを作成しようとしています。このような何か:Hibernateの基準クエリ

SELECT a.SHOP_ID, a.SHOP_ADDRESS, (SELECT COUNT(*) FROM 
SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID) as NUM_EMPLOYEES FROM <--Problem here 
SHOPS a 
WHERE 
QUERY_STATUS ='Open' 

だから私はshopId、shopAddres、numEmployeesと従業員のために類似したとJavaクラスのショップがあります。

マイサブクエリ:

DetachedCriteria subquery = DetachedCriteria.forClass(
    Employee.class, "b").add(
    Property.forName("b.shopId").eqProperty("a.shopId")) 
    .setProjection(
    Projections.projectionList().add(
     Projections.rowCount())); 

とのライン上の主な基準クエリ:

List shopListRet = session.createCriteria(Shop.class, "a") 
    .setProjection(
    Projections.projectionList().add(
     Projections.property("a.shopId"))).add(Subquery..."DONT KNOW WHAT SHOULD COME HERE").list(); 

私の質問は次のとおりです。

  • 私のように独立したクエリを関連付けるにはどうすればよいですサブクエリを使用して、クラスの変数numEmployeesの集計結果をShopクラスで収集しますか?

おかげ -J

答えて

2

は、サブクエリを追加するSQLプロジェクションを使用してください。

String subSql = "SELECT COUNT(*) FROM SHOP_EMPLOYEES b WHERE b.SHOP_ID = a.SHOP_ID" 
... 
    .add(Projections.sqlProjection(
     subSql , 
     new String[] { "NUM_EMPLOYEES" }, 
     new Type[] { Hibernate.LONG } 
    ); 
+1

こんにちは、ありがとうございました。私はエイリアスに対応するために少し質問を微調整しなければならなかった。このような何か:文字列subSql = "(SELECT COUNT(*)SHOP_EMPLOYEES BからWHERE b.SHOP_ID = {別名} .SHOP_ID)NUM_EMPLOYEESとして"。その後、働いた。あなたの答えを正しいものとして受け入れる - 乾杯 - J – joesatch