如何使用 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 期望 null
在 projection
中自行生成所有列 - 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)
在 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 期望 null
在 projection
中自行生成所有列 - 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)