2013-04-09 18 views
7

Come possiamo recuperare le entità liferay tramite il custom-finder utilizzando SQL personalizzato?Come recuperare l'entità liferay tramite il mirino personalizzato nel portlet del plugin personalizzato?

  1. In seguito è la mia query SQL scritto in default.xml ( ho tagliato verso il basso la query al minimo in modo che la logica rimane semplice. Dal momento che comprendeva un paio di funzioni e unisce non abbiamo potuto utilizzare DynamicQuery API):

    SELECT 
        grp.* 
    FROM 
        Group_ 
    WHERE 
        site = 1 
        AND active_ = 1 
        AND type_ <> 3 
    
  2. relativo codice in 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); 
    } 
    

Questo codice sopra riportato non funziona poiché la classe GroupImpl è presente in portal-impl.jar e questo jar non può essere utilizzato nel portlet personalizzato.

Ho anche provato ad utilizzare sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
Ma questo codice precedente genera un'eccezione:

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

Ma lo stesso codice funziona per il nostro custom-entità, se scriviamo sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);.

Grazie

risposta

8

ho scoperto dal liferay forum thread che invece di session = openSession(); avremmo bisogno per andare a prendere la sessione dal liferaySessionFactory come segue per farlo funzionare:

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

Spero che questo aiuti qualcuno su StackOverflow, inoltre ho trovato un bel tutorial riguardante custom-sql che usa anche lo stesso approccio.

+0

la chiamata closeSession sul blocco finally chiude quella sessione? Ho guardato il codice di liferay e ho scoperto che utilizza la sessionFactory del finder per chiudere la sessione, quindi la mia domanda. –

+0

@ user1316487 Penso che in questo caso dovrebbe essere "sessionFactory.closeSession (session)". Grazie per la segnalazione. –