2013-04-09 6 views
7

W jaki sposób możemy pobrać podmioty liferay za pomocą wyszukiwarki niestandardowej przy użyciu niestandardowego kodu SQL?Jak pobrać encję liferay za pomocą wyszukiwarki niestandardowej w niestandardowym portlecie wtyczki?

  1. Poniżej moje zapytanie SQL napisany w default.xml ( mam okrojone zapytanie do minimum tak, że logika pozostaje prosty. Ponieważ zawiera kilka funkcji i przyłącza nie mogliśmy skorzystać DynamicQuery API)

    SELECT 
        grp.* 
    FROM 
        Group_ 
    WHERE 
        site = 1 
        AND active_ = 1 
        AND type_ <> 3 
    
  2. odpowiedniego kodu w MyCustomGroupFinderImpl.java:

    Session session = null; 
    
    try { 
        session = openSession(); 
    
        // fetches the query string from the default.xml 
        String sql = CustomSQLUtil.get(FIND_ONLY_ACTIVE_SITES); 
    
        SQLQuery sqlQuery = session.createSQLQuery(sql); 
    
        sqlQuery.addEntity("Group_", GroupImpl.class); 
        // sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl")); 
    
        return (List<Group>) QueryUtil.list(sqlQuery, getDialect(), 0, QueryUtil.ALL_POS); 
    } 
    catch (Exception e) { 
        throw new SystemException(e); 
    } 
    finally { 
        closeSession(session); 
    } 
    

Powyższy kod nie zadziała, ponieważ klasa GroupImpl jest obecna w portal-impl.jar, a tego słoika nie można używać w niestandardowym portlecie.

Próbowałem też za pomocą sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
Ale powyższy kod wyrzuca wyjątek:

com.liferay.portal.kernel.exception.SystemException: 
    com.liferay.portal.kernel.dao.orm.ORMException: 
     org.hibernate.MappingException: 
      Unknown entity: com.liferay.portal.model.impl.GroupImpl 

Ale ten sam kod działa dla naszego niestandardowym podmiotu, jeżeli piszemy sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);.

Dzięki

Odpowiedz

8

dowiedziałem się od liferay forum thread że zamiast session = openSession(); musielibyśmy sprowadzić sesję z liferaySessionFactory w następujący sposób, aby to działało:

// fetch liferay's session factory 
SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory"); 

Session session = null; 

try { 
    // open session using liferay's session factory 
    session = sessionFactory.openSession(); 

    // fetches the query string from the default.xml 
    String sql = CustomSQLUtil.get(FIND_ONLY_ACTIVE_SITES); 

    SQLQuery sqlQuery = session.createSQLQuery(sql); 

    // use portal class loader, since this is portal entity 
    sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl")); 

    return (List<Group>) QueryUtil.list(sqlQuery, getDialect(), 0, QueryUtil.ALL_POS); 
} 
catch (Exception e) { 
    throw new SystemException(e); 
} 
finally { 
    sessionFactory.closeSession(session); // edited as per the comment on this answer 
    // closeSession(session); 
} 

Nadzieja to pomaga kogoś na stackoverflow, również znalazłem ładne tutorial dotyczące niestandardowego sql, który również używa tego samego podejścia.

+0

Czy to wywołanie closeSession na bloku finally zamknie tę sesję? Spojrzałem na kod liferay i znalazłem, że używa on sessionFactory wyszukiwarki, aby zamknąć sesję, stąd moje pytanie. –

+0

@ user1316487 Myślę, że powinno to być 'sessionFactory.closeSession (session)' w tym przypadku. Dziękuję za wskazanie tego. –

Powiązane problemy