2015-08-03 1 views
0

В Hibernate я могу сделать:Как получить прокручиваемые результаты с помощью Gorm DetachedCriteria?

// 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) 

Почему это происходит?

Когда вы передаете свои обособленные критерии (Горм), чтобы getHibernateDetachedCriteria и ваши отдельные критерии не имеют выступов, то новые отдельные критерии (спящий режим) будет иметь пустой список проекций вместо null - proof.

Ну, что из этого?

Hibernate ожидает null в projection для создания всех столбцов себя - proof

ответ

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) 
+0

Две ноты. Во-первых, в зависимости от того, где находится ваш код, вы, вероятно, можете пропустить первую строку и просто добавить свойство «def sessionFactory», чтобы включить sessionFactory в ваш объект. 2-й в зависимости от типа вашего запроса это может не сработать, в настоящее время я получаю NPE на линии HibernateCriteriaBuilder.java 222 [grails-datastore-gorm-hibernate4-5.0.1.RELEASE.jar: na] – Robert

+0

Спасибо за заметки. Можете ли вы показать свой запрос, который вызывает NPE? – AndreyT

+0

Конечно, это действительно ясно. Поскольку комментарии короткие, я сбрасывал небольшой интеграционный тест на github - https://github.com/rrsIPOV/gormDc101/blob/master/src/integration-test/groovy/gormDc/DetCritToDetCritIntSpec.groovy, gormDetachedCriteria.list() метод работает нормально, но код выше не работает/NPE (grails 3.1.1) – Robert

Смежные вопросы