2013-02-25 55 views
9

में प्रश्न पूछता है मैं आंतरिक जुड़ने के लिए एचक्यूएल निष्पादित करने में असमर्थ हूं, क्वेरी एसक्यूएल पर सही निष्पादित कर रही है लेकिन एचक्यूएल में नहीं है। मुझे नहीं पता कि मैं कहां लापता हूं। आपकी मदद सराहनीय है।आंतरिक एचक्यूएल

***Error***: org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ON near line 1, column 148 [SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price FROM com.model.Orders orders INNER JOIN orders.OrderProcessing as op ON op.u_id = orders.u_id INNER JOIN orders.Product as product ON product.p_id = orders.p_id WHERE product.p_id = '208' ORDER BY op.username] 

productList = (List<Orders>) session.createQuery(
"SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price " +                    
"FROM Orders orders " +                 
"INNER JOIN orders.OrderProcessing as op " +                      
"ON op.u_id = orders.u_id " +               
"INNER JOIN orders.Product as product " +                
"ON product.p_id = orders.p_id " +               
"WHERE product.p_id = '"+p_id +"' " +               
"ORDER BY op.username" 
).list(); 

उत्तर

17

एचक्यूएल में शामिल होने के थोड़ा अलग वाक्यविन्यास है।

यदि आप पहले से ही उन संगठनों को हाइबरनेट के साथ मैप किए गए हैं, तो जुड़ने की स्थितियां (जो id फ़ील्ड शामिल होने के लिए फ़ील्ड) आमतौर पर हाइबरनेट द्वारा नियंत्रित की जाती हैं (जो पहले से ही उस जानकारी को मैपिंग में परिभाषित करती है), इसलिए आप केवल जो विशेषता संघ के साथ मैप किया गया है निर्दिष्ट करने की आवश्यकता है, और ऐसा करने के लिए उस पर में शामिल होने:

SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price 
FROM Orders order 
INNER JOIN order.orderProcessing as op 
INNER JOIN order.product as product 
ORDER BY op.username 

मामले आप उन संगठनों मैप नहीं मिल गया है में, आप शायद वाक्य रचना की तरह शामिल हो एक क्रॉस का उपयोग करना चाहिए, और निर्दिष्ट WHERE खंड में स्थितियों में शामिल हों। कृपया ध्यान दें कि आपकी स्कीमा संरचना और डीबीएमएस के आधार पर दक्षता पर इसका नकारात्मक प्रभाव हो सकता है।

SELECT op.username, op.email, orders.p_id, orders.o_id, product.listed_price 
FROM Orders order, OrderProcessing op, Product product 
WHERE op.u_id = order.u_id AND product.p_id = orders.p_id 
ORDER BY op.username 

आप और अधिक जानकारी प्राप्त कर सकते पर HQL हाइबरनेट संदर्भ की 14.3. Associations and joins अनुभाग में जुड़ जाता है।

3

एचक्यूएल में शामिल हों एसक्यूएल में काम नहीं करते हैं। आप संबद्धता पर शामिल हो सकते हैं या तो:

select order_1.code, item.code, item.quantity 
from Order order_1 inner join order_1.item item; 

या एक बहु-तालिका का उपयोग का चयन करें:

select order_1.code, item.code, item.quantity 
from Order order_1, Item item where item.order=order_1; 

या तो वाक्य रचना फायदे और नुकसान हैं, तो आप स्थिति के आधार पर चयन करना चाहिए।

यह भी है कि एक निहित अंकन, जिस पर सभी में शामिल होने का उपयोग करने के अनावश्यक बना सकता है ध्यान देने योग्य है:

select item.order.code, item.code, item.quantity from Item item; 
+0

यह अभी भी काम नहीं कर रहा। OP.username, op.email, order.p_id, ऑर्डर चुनें।o_id "+ \t \t \t \t \t" आदेश से आदेश "+ \t \t \t \t \t" आंतरिक सेशन के रूप में शामिल हों order.orderProcessing "+ \t \t \t \t \t" आंतरिक उत्पाद "+ \t \t के रूप में शामिल हों order.product \t \t \t "कहाँ product.p_id =" + p_id + \t \t \t \t \t "ऑर्डर। Op.username –

+0

यदि उस स्ट्रिंग कॉन्सटेनेशन सीधे आपके द्वारा उपयोग किए जा रहे कोड से लिया जाता है, तो आप _where_ और _order by_ खंड से पहले ऑर्डर ऑर्डर_ से पहले और बाद में कई रिक्त स्थान खो रहे हैं। यदि यह समस्या नहीं है, तो हो सकता है कि आपको यह पता चलने से पहले कि आप क्या हो रहा है (और यदि संभव हो तो आपके व्यवसाय की वस्तुओं का मैपिंग/संरचना) – Grim

+0

org.hibernate.hql.ast.QuerySyntaxError: अप्रत्याशित टोकन : लाइन 1 के पास ऑर्डर, कॉलम 60 [SELECT op.username, op.email, order.p_id, order.o_idFROM ऑर्डर ऑर्डरइनर ऑर्डर करें। ऑर्डर इनरर के रूप में ऑर्डर करने के लिए ऑर्डर करें। उत्पाद के रूप में उत्पाद। Product._id = 208ORDER op.username द्वारा] –

0

मुझे लगता है ऐसा इसलिए है क्योंकि orderorder by में के रूप में एक आरक्षित शब्द (है)। इसके बजाए FROM Orders o करने का प्रयास करें।

मुझे लगता है कि आपको अन्य समस्याएं भी होंगी।

देखें कि आप क्या चुन रहे हैं (यादृच्छिक कॉलम मानों का एक गुच्छा), और आप हाइबरनेट को वापस लौटने की उम्मीद कर रहे हैं (List<Orders>)।

मैं तुम्हें वापस List<Orders> नहीं मिलेगा क्योंकि आपकी क्वेरी की संरचना HQL बजाय SQL मोड में हाइबरनेट के लिए बाध्य करेगा उम्मीद है। इस मोड में, आप बस List<Object[]> वापस प्राप्त करेंगे जहां प्रत्येक Object[] आपके द्वारा चुने गए चार कॉलम का एक सेट है।

इस कड़ी बताता है कि आप विभिन्न प्रश्नों के साथ वापस प्राप्त करने की उम्मीद कर सकते हैं:

http://www.laliluna.de/jpa-hibernate-guide/ch11s02.html

+0

मैं एक त्रुटि हो रही है द्वारा आदेश: org.hibernate.hql .ast.QuerySyntaxError: अप्रत्याशित टोकन: लाइन के करीब 1, कॉलम 148 [SELECT op.username, op.email, order.p_id, order.o_id, product.listed_price com.model से। ऑर्डर ऑर्डर इनर जॉइन ऑर्डर। ऑर्डर के रूप में ऑर्डर प्रोसेसिंग ON.u_id = order.u_id INNER आदेश में शामिल हों। उत्पाद पर उत्पाद के रूप में उत्पाद.p_id = orders.p_id जहां उत्पाद op.username द्वारा t.p_id = '208' ऑर्डर] –