【SSH】Hibernate中DetachedCriteria設定關聯屬性的查詢條件和獲取關聯屬性結果集的倆個問題!
阿新 • • 發佈:2019-02-08
問題一:Hibernate設定關聯屬性的查詢條件
如果我們想要在離線DetachedCriteria中設定物件的關聯屬性物件的非外來鍵屬性的查詢條件,那麼要為關聯屬性設定一個別名!!注意:如果查詢的就是關聯屬性物件的id,這個時候物件資料庫中一般都有外來鍵,那麼hibernate查詢的時候就不需要使用inner join(內連線)額外地去另外一個表查詢,而是直接通過本表查詢,所以這種情況就不需要設定別名!!!
detachedCriteria.createAlias("關聯屬性名", "別名"),請看示例:
“比如我在一個物件裡面有一個關聯屬性物件是region,我查詢的時候要查詢region的一個屬性值province。”
detachedCriteria.createAlias("region", "r");//為關聯屬性設定一個別名!!!
if(StringUtils.isNotBlank(province)) {
detachedCriteria.add(Restrictions.like("r.province", "%"+province+"%"));
}
問題二:Hibernate獲取關聯屬性結果集
在實體中有一個關聯屬性的情況下,使用hibernate的離線detachedCriteria條件查詢的時候,hibernate預設返回的結果集是兩個物件(多個關聯屬性就是多個物件),不是我們想期望的一個物件中巢狀關聯屬性物件,從而轉換成json的時候能得到我們想要的鍵值對結果。但是這種情況可能導致轉換成json後前臺獲取不到資料,因為前臺可能匹配的是"物件.屬性"的形式,而返回的json可能不是這樣的,反正我用的fastjson就出現過這個問題。所以我們要設定hibernate的返回結果集的格式,變成一個物件裡面巢狀該物件的關聯屬性物件 。程式碼如下:
int firstResult=(currentPage-1)*pageSize; int maxResults=pageSize; //設定hibernate的結果集為一個物件中巢狀關聯屬性物件,而不是包含多個物件(該物件和關聯屬性物件) detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY); List findByCriteria2=this.getHibernateTemplate().findByCriteria(detachedCriteria, firstResult, maxResults);