如何使用Gorm DetachedCriteria获得ScrollableResults?

时间:2015-08-03 08:38:42

标签: hibernate grails gorm

在Hibernate我可以这样做:

// dc - DetachedCriteria
ScrollableResults sr = dc.getExecutableCriteria(getSession()).scroll()

但是如何对Gorm DetachedCriteria做同样的事情呢?

DomainName.withSession { session ->
    DomainName.where {
       // predicates
    }.getExecutableCriteria(session).scroll()
}

上面的代码将失败,因为方法不存在。

更新 我找到了这个解决方案:

 def hiberSession = Holders.grailsApplication.mainContext.sessionFactory.currentSession
 def hiberDc = HibernateCriteriaBuilder.getHibernateDetachedCriteria(null, gormDc)
 def sr = hiberDc.getExecutableCriteria(hiberSession).scroll()

但是传出的SQL在查询中没有列:

select from domain_name where ... ;

更新:我深入挖掘并找到了以前问题的解决方案。

hiberDc.setProjection(null)

为什么会这样?

当您将分离的条件(gorm)传递给getHibernateDetachedCriteria并且您的分离条件没有投影时,那么新的分离条件(休眠)将具有空的预测列表而不是null - {{3 }}。

那么,它是什么?

Hibernate希望null中的projection生成所有列自我 - proof

1 个答案:

答案 0 :(得分:1)

所以,回答我的问题将是:

def currentSession = Holders.grailsApplication.mainContext.sessionFactory.currentSession
def hibernateDetachedCriteria = HibernateCriteriaBuilder.getHibernateDetachedCriteria(null, gormDetachedCriteria)
def criteria = hibernateDetachedCriteria.getExecutableCriteria(currentSession)
if (!criteria.projection) criteria.projection = null
def scrollableResults = criteria.scroll(ScrollMode.FORWARD_ONLY)