2014-02-21 36 views
2

對於Grails項目,我需要它通過關聯實體的字段進行排序。像獲取由作者排序項命名createAlias在分離標準(GORM)

org.hibernate.QueryException: could not resolve property: author.name of: Entry 

這是與Hibernate常見的問題,通常是通過引入一個別名author,像做:

def crteria = new DetachedCriteria(Entry) 
criteria.list { 
    order('author.name', 'asc') 
} 

當前的例子將失敗

criteria.createAlias('author') 
criteria.addOrder(Order.asc('author.name')) 

但是Grails gorm.DetachedCriteria沒有這個方法的問題,拋出NoSuchMethodException。我不想使用普通的hibernate.DetachedCritera,因爲需要支持使用Groovy標準編寫的舊代碼。

我如何添加這樣的別名?或者如何應用這種無類型的?

也許有一個是創建一個hibernate.DetachedCriteria,添加別名,然後將其轉換爲gorm.DetachedCriteria

-

PS什麼的瘋狂,常規order('author.name', 'asc')工作正常進行集成測試。僅在真實應用程序grails run-app上失敗。

+0

你已經嘗試使用'作家'作爲協會? 'criteria.list {author {order('name','asc')}}' – dmahapatro

+0

是的,我試過了。在這種情況下忽略它 –

回答

3

我相信你可以隨時從GORM標準構建器中獲得DetachedCriteria並使用HibernateCriteriaBuilder.getHibernateDetachedCriteria(query)對其進行修改。

GORM DetachedCriteria只是底層Hibernate DetachedCriteria的一個構建器接口。

+0

這是一個好主意。但問題是,如果我在應用GORM標準之前執行此操作,則會忽略此順序(我剛剛克隆了原始查詢,因此我無法將GORM原始資料轉換爲原始標準)。我不能在GORM調用後應用它,因爲'crit.list {}'返回實際列表。好像我需要訪問Hibernate _inside_' crit.list {}'封閉,就在GORM構建Hibernate Criteria的那一刻。 –

+0

@Igor:你爲什麼不使用構建的Hibernate標準來執行列表?它會返回與使用GORM的crit.list()執行的查詢不同的域實例嗎? – sola

+0

由於現有代碼與此類不兼容。但是現在我已經重寫了這個部分,而是使用HibernateCriteriaBuilder,效果很好。我應該接受你的答案 –

1

我該如何添加這樣的別名?

我們cannot在DetachedCriteria中,如你所說。

如何應用這種不帶呢?

其他選項包括withCriteria,createCriteria和各種其他方式。我現在可以想到的最懶但最骯髒的方式是:

Entry.where{ }.collect()?.sort{ it.author?.name } 

我覺得你也會試一試。 :)