2013-01-02 69 views
1

的表之間的關係如下:休眠標準與多個左內API聯接

  • A的用戶表的列同一性,用戶名,年齡
  • 的地址表的列同一性,類型,街道
  • 具有列標識,用戶標識和地址標識的user_address_associations表。用戶標識符與用戶有外鍵關係。標識符和地址標識符具有外鍵關係到地址標識符。

我希望選擇地址類型設置爲1的所有超過18年的用戶。用戶和地址實體的Hibernate映射存在,但在用戶到地址的映射中沒有定義關聯。用戶和地址之間的唯一鏈接通過user_address_associations表指定。另外,User類未定義Addresses屬性。

原始SQL將是:

select * from users 
inner join user_address_associations 
on user_address_associations.userid=users.identity 
inner join addresses 
on user_address_associations.addressid=addresses.identity and addresses.type=1 
where db.users.age >= 18 

使用的Hibernate 3.6.5標準API,我開始與此:

Criteria criteria = session.createCriteria(User.class); 

// how to do the join to addresses table through user_address_associations table? 

// where clause 
criteria.add(Restrictions.gt("Age", 1176)); 

的問題是,我怎麼formuate的加入?

+0

可能的[Hibernate標準和多重連接]的副本(http://stackoverflow.com/questions/2252468/hibernate-criteria-and-multiple-join) – mindas

+0

@mindas,謝謝你的迴應。我剛剛閱讀了您在引用鏈接中發佈的答案,但仍需要對.createCriteria(「b」,「join_between_a_b」)進行一些清晰的說明,以及如何轉化爲A類和B類之間的聯接。仍然還試圖瞭解API文檔。 –

+0

「如何轉換爲類A和B之間的連接」 - 如果要查看實際生成的SQL,請爲org.hibernate.SQL啓用跟蹤日誌記錄。如果你想了解Hibernate如何在內部完成它,你需要研究Hibernate的源代碼。 – mindas

回答

2

這是不可能的。 Hibernate查詢(HQL或Criteria)只使用實體,它們的持久字段及其關聯。如果連接表沒有被映射,也沒有被用來定義用戶和地址實體之間的關聯,那麼你就不能用Hibernate定義查詢,當然除了SQL查詢。

+0

謝謝。將研究修改實體來定義關係。 –