2013-04-09 8 views
7

Wie können wir liveray-Entitäten über Custom-Finder mit benutzerdefiniertem SQL abrufen?Wie liferey Entity über benutzerdefinierten Finder in benutzerdefinierten Plugin-Portlet abrufen?

  1. Es folgt meine SQL-Abfrage geschrieben in default.xml ( Ich habe die Abfrage auf das Nötigste abgespeckt, so dass die Logik einfach bleibt. Da es einige Funktionen enthalten und schließt sie uns nicht DynamicQuery API verwenden könnten):

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

Dieser obige Code funktioniert nicht, da die Klasse GroupImpl in portal-impl.jar vorhanden ist und dieses JAR nicht im benutzerdefinierten Portlet verwendet werden kann.

Ich habe auch versucht sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
Aber der obige Code löst Ausnahme mit:

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

Aber der gleiche Code funktioniert für unsere custom-Einheit, wenn wir sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class); schreiben.

Dank

Antwort

8

ich aus dem liferay forum thread, dass wir die Sitzung von liferaySessionFactory holen müssten statt session = openSession(); fand heraus, wie es Arbeit zu bilden folgt:

dies jemand auf Stackoverflow hilft
// 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); 
} 

Hope, Ich fand auch eine nette tutorial in Bezug auf Custom-SQL, die auch den gleichen Ansatz verwendet.

+0

würde das closeSession-Aufruf auf dem endgültigen Block diese Sitzung schließen? Ich schaute auf den Code von liveray und fand heraus, dass er die SessionFactory des Finders verwendet, um die Sitzung zu schließen, daher meine Frage. –

+0

@ user1316487 Ich denke, es sollte 'sessionFactory.closeSession (Sitzung)' in diesem Fall sein. Danke, dass du darauf hingewiesen hast. –