2011-11-15 10 views
6

सभी,हाइबरनेट: एक गैर-इकाई एसक्यूएल क्वेरी के लिए कॉलम को कैसे उपनाम करें?

किसी को भी पता है कि कैसे मैं कॉलम कल्पित नामों का प्रयोग करने के लिए SqlQuery वर्ग प्रत्यक्ष कर सकते हैं एक गैर प्रबंधित इकाई क्वेरी पर लौटाया?

मैं गैर-इकाई POJO की सूची बनाने के लिए SqlQuery हाइबरनेट क्लास का उपयोग करने का प्रयास कर रहा हूं, लेकिन SQL क्वेरी में कॉलम को उपनाम करने का प्रयास करने में समस्या में भाग रहा हूं। जब मैं अपने एसक्यूएल (जैसे SELECT o.id as orderId, ps.code as prescriptionStatus...) में उपनाम डालने का प्रयास करता हूं, तो हाइबरनेट शिकायत करता है कि उसे कॉलम "एक्स" नहीं मिल सकता है, जहां कॉलम "एक्स" गैर-एलियाड कॉलम नाम है (उदाहरण के लिए "ऑर्डर आईडी" के बजाय "आईडी") ।

यदि मैं अपने लौटे कॉलम को उपनाम नहीं करता हूं, तो सब ठीक है, लेकिन मेरे पीओजेओ को तब गैर-एलियाज्ड फील्ड नामों के साथ गुण रखने के लिए मजबूर किया गया है, या मुझे पीओजेओ के भीतर मैपिंग प्रबंधित करना है (अच्छा नाम लौटने वाले गेटर्स गैर-उपनाम क्षेत्र के नाम)।

यहाँ मेरी कोड है

//TODO: change builder to a name query --jg 

    StringBuilder sql = new StringBuilder(); 

    sql.append("SELECT o.id,\n"); 
    sql.append("  pet.name,\n"); 
    sql.append("  o.order_date,\n"); 
    sql.append("  rx_view.prescription_id,\n"); 
    sql.append("  rx_view.code\n"); 
    sql.append("FROM order_line_item oli\n"); 
    sql.append("  JOIN order_detail o\n"); 
    sql.append("   ON o.id = oli.order_id\n"); 
    sql.append("  JOIN order_line_item_pet olip\n"); 
    sql.append("   ON olip.order_line_item_id = oli.id\n"); 
    sql.append("  JOIN pet\n"); 
    sql.append("   ON pet.id = olip.pet_id\n"); 
    sql.append("  LEFT JOIN (SELECT olip.order_line_item_id order_line_item_id,\n"); 
    sql.append("       olip.prescription_id,\n"); 
    sql.append("       ps.code\n"); 
    sql.append("     FROM prescription_order_line_item olip\n"); 
    sql.append("       JOIN prescription p\n"); 
    sql.append("       ON olip.prescription_id = p.id\n"); 
    sql.append("       JOIN prescription_status ps\n"); 
    sql.append("       ON p.status_id = ps.id) rx_view\n"); 
    sql.append("   ON rx_view.order_line_item_id = oli.id\n"); 
    sql.append("WHERE oli.order_id IN (SELECT o.id\n"); 
    sql.append("      FROM order_detail o\n"); 
    sql.append("        JOIN order_line_item oli\n"); 
    sql.append("         ON o.id = oli.order_id\n"); 
    sql.append("        JOIN prescription_order_line_item poli\n"); 
    sql.append("         ON oli.id = poli.order_line_item_id\n"); 
    sql.append("        JOIN prescription rx\n"); 
    sql.append("         ON rx.id = poli.prescription_id\n"); 
    sql.append("      WHERE rx.id = :prescriptionId)\n"); 



    SQLQuery query = baseDao.getSession().createSQLQuery(sql.toString()); 

    query.setLong("prescriptionId", prescriptionId); 


    query.setResultTransformer(Transformers.aliasToBean(RelatedPrescriptionOrderLine.class)); 

    List results = query.list(); 

    return results; 

धन्यवाद!

उत्तर

9

आप addScalar(String columnAlias, Type type) उपयोग कर सकते हैं करने के लिए स्पष्ट रूप से उर्फ ​​अपनी मूल एसक्यूएल के कॉलम:

उदाहरण के लिए:

SQLQuery query = baseDao.getSession().createSQLQuery("SELECT o.id as orderId, ps.code as prescriptionStatus..."); 
query.setLong("prescriptionId", prescriptionId); 
query.addScalar("orderId",StandardBasicTypes.INTEGER) 
query.addScalar("prescriptionStatus",StandardBasicTypes.STRING) 
query.setResultTransformer(Transformers.aliasToBean(RelatedPrescriptionOrderLine.class)) 

List results = query.list(); 

return results; 

ट्रांसफार्मर तो एक वर्ग सेटर के साथ RelatedPrescriptionOrderLine कहा जाता है के लिए दिखेगा बुलाया setPrescriptionId(), setPrescriptionStatus() आदि , और इन सेटर्स के माध्यम से इसके उदाहरण के परिणाम को पॉप्युलेट करें।

+0

उत्कृष्ट! धन्यवाद। मैं देखता हूं कि यदि आप इसे नामित क्वेरी में कनवर्ट करना चाहते हैं तो आप स्केलर निर्दिष्ट कर सकते हैं। –

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