2013-04-09 4 views
7

हम कस्टम एसक्यूएल का उपयोग कर कस्टम-फाइंडर के माध्यम से जीवनभर इकाइयों को कैसे ला सकते हैं?कस्टम प्लगइन पोर्टलेट में कस्टम-खोजक के माध्यम से जीवनकाल इकाई कैसे प्राप्त करें?

  1. के बाद मेरी एसक्यूएल में default.xml ( मैं न्यूनतम करने के लिए क्वेरी कांट छांट कर दिया है ताकि तर्क सरल बनी हुई है। चूंकि यह कुछ कार्यों शामिल लिखा क्वेरी है और मिलती है हम DynamicQuery एपीआई का उपयोग नहीं कर सकता है):

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

यह उपरोक्त कोड GroupImpl वर्ग portal-impl.jar में मौजूद नहीं है और यह जार कस्टम पोर्टलेट में उपयोग नहीं किया जा सकता है।

मैं भी sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
उपयोग करने की कोशिश लेकिन यह ऊपर कोड अपवाद फेंकता है:

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

लेकिन एक ही कोड हमारे कस्टम इकाई के लिए काम करता है, अगर हम sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class); लिखें।

धन्यवाद

उत्तर

8

मैं liferay forum thread कि बजाय session = openSession(); हम के रूप में यह काम करने के लिए इस प्रकार liferaySessionFactory से सत्र लाने के लिए की आवश्यकता होगी से पता चला:

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

आशा इस stackoverflow पर किसी को मदद करता है, मुझे कस्टम-एसक्यूएल के बारे में एक अच्छा tutorial मिला जो एक ही दृष्टिकोण का उपयोग करता है।

+0

क्या वह बंद होगा आखिरकार उस सत्र को बंद करने पर सत्र कॉल? मैंने लाइफरे के कोड को देखा और पाया कि यह सत्र का उपयोग करने के लिए खोजक का सत्र का उपयोग करता है इसलिए मेरा प्रश्न। –

+0

@ user1316487 मुझे लगता है कि यह इस मामले में 'sessionFactory.close सत्र (सत्र)' होना चाहिए। यह बात बताने के लिए धन्यवाद। –

संबंधित मुद्दे

 संबंधित मुद्दे