2013-04-09 20 views
7

Özel SQL kullanarak özel bulucu aracılığıyla liferay varlıkları nasıl alabiliriz? TakipÖzel eklenti portletinde özel bulucu aracılığıyla liferay varlık nasıl alınır?

  1. mantık basit kalmayacak şekilde birkaç fonksiyonları dahil beri. Minimumda sorgu aşağı kesilmiş olan default.xml ( yazılmış benim sql sorgusu ve biz DynamicQuery API kullanamadı katılır):

    SELECT 
        grp.* 
    FROM 
        Group_ 
    WHERE 
        site = 1 
        AND active_ = 1 
        AND type_ <> 3 
    
  2. ilgili kod MyCustomGroupFinderImpl.java içinde:

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

Yukarıdaki kod sınıfı portal-impl.jar sınıfında mevcut olduğundan ve bu jar özel portlette kullanılamaz.

Ben de sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
kullanarak çalıştı Ama bu yukarıdaki kod istisna atar:

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

Ama sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class); yazarsanız aynı kod, bizim özel varlık için çalışıyor.

Teşekkür

cevap

8
Ben çalışması için aşağıdaki gibi yerine session = openSession(); biz liferaySessionFactory gelen oturumu getirmesi gerekir liferay forum thread öğrendim

:

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

Umut bu stackoverflow birilerini yardımcı olur, Ayrıca aynı yaklaşımı da kullanan custom-sql ile ilgili güzel bir tutorial buldum.

+0

Bu sonuncu bloktaki closeSession çağrısı bu oturumu kapatır mı? Liferay koduna baktım ve soruyu kapatmak için bulucunun sessionFactory uygulamasını kullandığını gördüm. –

+0

@ user1316487 Bu durumda "sessionFactory.closeSession (session)" olması gerektiğini düşünüyorum. Bunu işaret ettiğin için teşekkürler. –

İlgili konular