दिलचस्प पोस्ट
उथले क्लोन को पूर्ण क्लोन में परिवर्तित करें सीएसएस चयनकर्ता "फू जिसमें बार होता है" के लिए? `Let` और` var` में तेजी के बीच अंतर क्या है? UIImagePickerController स्क्रीन को भर नहीं करता है डॉकर कंटेनर से मेजबान करने के लिए फ़ाइलें कॉपी करना विकृत UTF-8 वर्णों के साथ Android WebView एचटीटीपी क्लाइंट बेसएड्रेस काम क्यों नहीं कर रहा है? DBUpdateException के कारण ढूंढना डमीज के लिए एनएसआईवॉवेशन? विशिष्ट प्रतिबद्ध निकालें मैं iPhone अनुप्रयोग के साथ फाइल प्रकार कैसे संबद्ध करूं? रेगेक्स: मैच सब कुछ लेकिन Chrome में निश्चित तत्व गायब हो जाता है जावा जेनेरिक्स (वाइल्डकार्ड) स्ट्रिंग के लिए एक बड़ी टेक्स्ट फ़ाइल खोजने का सस्ता तरीका

जेपीए द्वारा जारी एसक्यूएल प्रश्नों को कैसे देखें?

जब मेरा कोड इस तरह कॉल करता है:

entityManager.find(Customer.class, customerID); 

इस कॉल के लिए मैं SQL क्वेरी कैसे देख सकता हूं? यह मानते हुए कि मैं कॉल करने के लिए डेटाबेस सर्वर / एक्सेस करने के लिए डेटाबेस सर्वर तक पहुंच नहीं पा रहा हूं, क्या मेरी IDE में लॉग इन करने या देखने के लिए वहां जेपीए कॉल्स द्वारा जारी किए गए एसक्यूएल प्रश्नों का पता लगाया जा सकता है? मैं jtds चालक का उपयोग कर SQL सर्वर 2008 R2 के खिलाफ जा रहा हूँ।

वेब के समाधान से एकत्रित समाधान "जेपीए द्वारा जारी एसक्यूएल प्रश्नों को कैसे देखें?"

लॉगिंग विकल्प प्रदाता-विशिष्ट हैं आपको यह जानना चाहिए कि आप किस जेपीए के कार्यान्वयन का उपयोग करते हैं

  • हाइबरनेट ( यहां देखें ):

     <property name = "hibernate.show_sql" value = "true" /> 
  • ईक्लिप्स लिंक ( यहां देखें ):

     <property name="eclipselink.logging.level" value="FINE"/> 
  • ओपनजेपीए ( यहां देखें ):

     <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/> 
  • डेटा न्यूक्लियस ( यहां देखें ):

    लॉग श्रेणी DataNucleus.Datastore.Native को सेट करें। स्तर के लिए मूल, जैसे DEBUG

साथ ही, अगर आप एक्लिप्स लिंक का उपयोग कर रहे हैं और SQL पैरामीटर मानों को आउटपुट करना चाहते हैं, तो आप इस प्रथा को अपनी दृढ़ता फ़ाइल में जोड़ सकते हैं।

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

एक्लिप्स लिंक में रनटाइम पर एक विशिष्ट क्वेरी के लिए एसक्यूएल प्राप्त करने के लिए आप डाटाबेस कन्ज्यूटी 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(); 

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

 DatabaseRecord recordWithValues= new DatabaseRecord(); recordWithValues.add(new DatabaseField("param1"), "someValue"); String sqlStringWithArgs = databaseQuery.getTranslatedSQLString(session, recordWithValues); 

स्रोत: एक क्वेरी के लिए एसक्यूएल कैसे प्राप्त करें

यदि आप हाइबरनेट और लॉबैक का प्रयोग अपने लॉगर के रूप में करते हैं तो आप निम्न का उपयोग कर सकते हैं (केवल बाइंडिंग दिखाता है और परिणाम नहीं):

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>return message.toLowerCase().contains("org.hibernate.type") &amp;&amp; logger.startsWith("returning");</expression> </evaluator> <OnMismatch>NEUTRAL</OnMismatch> <OnMatch>DENY</OnMatch> </filter> </appender> 

org.hibernate.SQL = DEBUG क्वेरी प्रिंट करता है

 <logger name="org.hibernate.SQL"> <level value="DEBUG" /> </logger> 

org.hibernate.type = TRACE बाइंडिंग प्रिंट करता है और आम तौर पर परिणाम, जो कि कस्टम फिल्टर के माध्यम से दबाया जाएगा

 <logger name="org.hibernate.type"> <level value="TRACE" /> </logger> 

आपको जैनिनो निर्भरता (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator) की आवश्यकता है:

 <dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>2.6.1</version> </dependency> 

ओपनजेपी में सभी एसक्यूएल और मापदंडों को देखने के लिए, इन दो मापदंडों को persistence.xml में रखें:

 <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/> <property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" /> 

यदि आप पैरामीटर मानों और रिटर्न मानों के साथ सटीक प्रश्नों को देखना चाहते हैं तो आप जेडीबीसी प्रॉक्सी ड्राइवर का उपयोग कर सकते हैं। यह सभी जेडीबीसी कॉलों को रोक देगा और उनके मूल्यों को लॉग करेगा। कुछ प्रॉक्सी:

  • log4jdbc
  • jdbcspy

वे कुछ अतिरिक्त सुविधाएं भी प्रदान कर सकते हैं, जैसे क्वेरीज़ के लिए निष्पादन समय को मापने और आंकड़े इकट्ठा करना।

उदाहरण log4j ( src \ log4j.xml ) का उपयोग करते हुए:

 <?xml version="1.0" encoding="UTF-8" ?> 

 <appender name="CA" class="org.apache.log4j.AsyncAppender"> <param name="BufferSize" value="512"/> <appender-ref ref="CA_OUTPUT"/> </appender> <appender name="CA_OUTPUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/> </layout> </appender> <logger name="org.hibernate.SQL" additivity="false"> <level value="DEBUG"/> <appender-ref ref="CA"/> </logger> <root> <level value="WARN"/> <appender-ref ref="CA"/> </root> 

Persistence.xml नामक एक फाइल है, Ctrl + Shift + R दबाएं और उसे ढूंढें, फिर, एक ऐसा जगह है जिसे शो एसक्यूएल जैसा कुछ लिखा गया है।

बस इसे सच मानो

मुझे यकीन नहीं है कि सर्वर डीबग मोड के रूप में शुरू किया जाना चाहिए। कंसोल पर बनाए गए SQL की जांच करें

देखें स्प्रिंग जेपीए विक्रेता अडैप्टर का इस्तेमाल करके एसआईटी दिखाते समय हाइबरनेट रोक नहीं सकते

इसके अतिरिक्त, यदि WildFly / JBoss का उपयोग कर रहा है, तो ORG.hibernate का लॉगिंग स्तर DEBUG को सेट करें

WildFly में लॉगिंग हाइबरनेट करें