2013-02-07 11 views
5

Napisałem zapytanie kryteria w klasie usług Grails gdzie oczekują chętny dołączyć do wykonania, oraz w celu uniknięcia leniwe ładowanie obiektów podrzędnych podczas wyświetlania moje wyniki zarówno jako odpowiedź JSON lub w moim GSP. Zapytanie wykonywane zgodnie z oczekiwaniami (ustawienie mojego hibernate.show_sql = true w moim DataSource.groovy widzę kwerendy), ale kiedy przemierzają stowarzyszenie w moim GSP, widzę, że hibernacja jest wykonywanie kolejnych zapytań, jak gdyby były leniwie ładowania stowarzyszenia. Nie jestem przekonany, że tak naprawdę to działa. Nie chcę ustawić leniwy: false w mojej klasie domeny dla tych skojarzeń.Grails Gorm Kryteria Zapytanie Chętni Pobieranie

To zapytanie kryteria:

def market = Market.withCriteria(uniqueResult:true){ 
    idEq(marketId) 
    fetchMode 'resourceAssignments', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole.role', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole.user', FetchMode.JOIN 
    resourceAssignments{ 
     userRole{ 
      role{ 
       'in'('name', roleNames) 
      } 
     } 
    }   
} 

Powyższe zwroty kwerendy bez żadnych problemów. Gdy próbuję uruchomić poniższy kod, chociaż, moim GSP, widzę, że hibernacja jest wydając drugą kwerendę tak, jakby były leniwie ściągam z resourceAssignments:

<g:each in="${market.resourceAssignments}" var="ra"> 
</g:each> 

Próbowałem nawet przesłanianie OpenSessionInViewInterceptor z nr -OP przechwytujący, tworząc pustą WebRequestInterceptor i ustawienie openSessionInViewInterceptor w resources.groovy go używać. Raz zrobiłem, że mogę dostać org.hibernate.LazyInitializationException który wydaje się zweryfikować, co myślałem - że Hibernate lub GORM wciąż próbuje wykonać drugą kwerendę, nawet kiedy już określono, że chcę z niecierpliwością sprowadzić te skojarzenia.

Odpowiedz

5

Wydaje się być błąd Grails z kryteriami zapytaniami. Oto zapytanie HQL, które działa:

def market = Market.executeQuery(
    'select m from Market m ' + 
    'inner join fetch m.resourceAssignments as ra ' + 
    'inner join fetch ra.userRole as ur ' + 
    'inner join fetch ur.role as role ' + 
    'inner join fetch ur.user as user ' + 
    'where m.id=:marketId and role.name in (:roleNames)', 
    [marketId: marketId, roleNames: roleNames], [max: 1])[0] 
+1

Dzięki Burt. Będziemy używać HQL do czasu naprawienia błędu. Bobby Warner składać błąd w Jira dla tej kwestii dla zainteresowanych: http://jira.grails.org/browse/GRAILS-9829 –

+0

JIRA kwestia wymieniona przez @DavidMalone zostało przeniesione do GitHub https://github.com/ grails/grails-core/issues/2764 –

Powiązane problemy