在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
答案 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)