2010-03-03 8 views
23

मैं विकास के दौरान, EclipseLink द्वारा कंसोल में उत्पन्न SQL को आउटपुट करना चाहता हूं। हालांकि, मैं केवल लॉगिंग स्तर फाइन का उपयोग कर ऐसा कर सकता था। मेरे पास कई कक्षाओं से बना एक जटिल डोमेन मॉडल है, इतना है कि तैनाती समय की काफी मात्रा में होती है जब लॉग वर्बोजिटी ठीक स्तर पर होती है, क्योंकि एक्लिप्ससेंक पूरे मॉडल के विश्लेषण को आउटपुट करता है।क्या लॉग verbosity बढ़ाने के बिना EclipseLink का उपयोग कर उत्पन्न एसक्यूएल आउटपुट संभव है?

क्या लॉग स्तर ठीक (जैसे हाइबरनेट करता है) का उपयोग किए बिना एसक्यूएल प्राप्त करने का कोई तरीका है?

उत्तर

43

अपने persistence.xml में निम्नलिखित गुण रखो:

<property name="eclipselink.logging.level.sql" value="FINE"/> 
<property name="eclipselink.logging.parameters" value="true"/> 

बाद, उपयोगी है ताकि पैरामीटर का मान दिखाए जाते हैं।

एक विकल्प log4jdbc या log4jdbc-remix का उपयोग कर रहा है।

17

this thread के अनुसार, ग्रहण लिंक के लिए लॉग पीढ़ी सेट करना मुश्किल लगता है।

<property name="eclipselink.weaving" value="static" /> 
<property name="eclipselink.logging.level.sql" value="FINEST" /> 
<property name="eclipselink.logging.level" value="FINEST" /> 
<property name="eclipselink.logging.level.cache" value="FINEST" /> 

लेकिन कुछ अन्य सेटिंग्स की जरूरत हो सकती:

यह आप अनुकूलित कर सकते हैं लॉग स्तर के साथ एक persistence.xml फ़ाइल का उल्लेख है।

Martin दस्तावेज below, "EclipseLink/Examples/JPA/Logging" उन गुणों को दस्तावेज करता है।

+2

हाँ, यह काम करता है। आपका बहुत बहुत धन्यवाद! नया सवाल अब है - यह कहीं दस्तावेज क्यों नहीं है? और यदि यह है, तो यह खोजना क्यों आसान नहीं है? ;) – javabeats

+0

@javabeats दस्तावेज़ीकरण [EclipseLink विकी] (https://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging) में पाया जा सकता है (पहले परिणाम 'ग्रहण लिंक लॉगिंग' के लिए खोज करते समय)। – Martin

+0

@ मार्टिन धन्यवाद। मैंने अधिक दृश्यता के उत्तर में आपकी टिप्पणी शामिल की है। – VonC

6

रनटाइम पर किसी विशिष्ट क्वेरी के लिए SQL प्राप्त करने के लिए आप डेटाबेसQuery API का उपयोग कर सकते हैं।

Query query = em.createNamedQuery("findMe"); 
Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord()); 

String sqlString = databaseQuery.getSQLString(); 

इस एसक्यूएल में शामिल होगा? पैरामीटर के लिए। SQL के तर्कों के साथ अनुवादित करने के लिए आपको पैरामीटर मानों के साथ डेटाबेस रिकॉर्डर की आवश्यकता है।

DatabaseRecord recordWithValues= new DatabaseRecord(); 
recordWithValues.add(new DatabaseField("param1"), "someValue"); 

String sqlStringWithArgs = 
     databaseQuery.getTranslatedSQLString(session, recordWithValues); 

स्रोत: How to get the SQL for a Query

+1

बहुत उपयोगी। सभी को लॉग इन करने के लिए ग्रहण लिंक सेट करना एक विशाल स्पैम है। इसे आसानी से उपयोगिता वर्ग में रखा जा सकता है और केवल दिलचस्प होने पर SQL को लॉग इन करने के लिए परिशुद्धता के साथ उपयोग किया जा सकता है। जैसे जहां बनाने के लिए उपयुक्त एसक्यूएल इंडेक्स खोजने की कोशिश कर रहा है, और कहीं और नहीं। धन्यवाद। – 99Sono

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

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