如何使用 Gorm DetachedCriteria 获取 ScrollableResults?

How to get ScrollableResults with Gorm DetachedCriteria?

在 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 并且您的分离条件没有投影时,新的分离条件 (hibernate) 将具有空的投影列表,而不是 null - proof

嗯,怎么样?

Hibernate 期望 nullprojection 中自行生成所有列 - proof

所以,我的问题的答案是:

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)