سؤال

وأنا أحاول أن تحويل الاستعلام SQL أدناه لHQL وأواجه بعض القضايا. A خط مستقيم عن طريق تحويل الخط لا يعمل، وأنا أتساءل عما اذا كان يجب استخدام الداخلية في تاريخ HQL؟

        SELECT (UNIX_TIMESTAMP(cosc1.change_date) - UNIX_TIMESTAMP(cosc2.change_date)) 
        FROM customer_order_state_change cosc1  
        LEFT JOIN customer_order_state cos1_new on cosc1.new_state_id = cos1_new.customer_order_state_id  
        LEFT JOIN customer_order_state cos1_old on cosc1.old_state_id = cos1_old.customer_order_state_id  
        LEFT JOIN customer_order_state_change cosc2 on cosc2.customer_order_id = cosc1.customer_order_id  
        LEFT JOIN customer_order_state cos2_new on cosc2.new_state_id = cos2_new.customer_order_state_id  
        LEFT JOIN customer_order_state cos2_old on cosc2.old_state_id = cos2_old.customer_order_state_id 
        WHERE cos1_new.name = "state1" AND  cos2_new.name = "state2" and cosc2.change_date < "2008-11-06 09:00" 
AND cosc2.change_date > "2008-11-06 06:00" GROUP BY cosc1.change_date, cosc2.change_date ;

والاستعلام بإرجاع الوقت بالثواني بين التغيرات الدولة لطلب العميل.

تضاف أسماء الدول ومواعيد حيوي في الاستعلام.

وتحرير: فقط حاول هذا

"SELECT (UNIX_TIMESTAMP(cosc1.changeDate) - UNIX_TIMESTAMP(cosc2.changeDate))" + 
        " FROM" + 
        " " + CustomerOrderStateChange.class.getName() + " as cosc1" +
        " INNER JOIN " + CustomerOrderStateChange.class.getName() +  " as cosc2" +
        " WHERE cosc1.newState.name = ?" +
        " AND cosc1.order.id = cosc2.order.id" + 
        " AND cosc2.newState.name = ?" +
        " AND cosc2.changeDate < ?" +
        " AND cosc2.changeDate > ?" + 
        " GROUP BY cosc1.changeDate, cosc2.changeDate";

وحصل على استثناء " الخارجي أو كاملة الانضمام يجب أن يتبعه تعبير مسار "

هل كانت مفيدة؟

المحلول

وعادة ما HQL ينضم المحددة باستخدام الخاصية على الكائن، على سبيل المثال، إذا الطبقة فو وبار وFoo.bar هو من نوع بار، ثم from Foo f inner join f.bar as b هو الانضمام. وبقدر ما أعرف، وليس هناك وسيلة لأداء الانضمام الذاتية في HQL (I يمكن أن يكون الخطأ هنا).

وقال ذلك، السبات يسمح لك لكتابة (تعزيز قليلا) الاستفسارات SQL مع session.createSQLQuery(...).

نصائح أخرى

وانتهى الأمر يتغير لاستخدام SQL الأصلي وPreparedStatement كما يبدو أن session.createSQLQuery السبات و() سوف تعمل فقط للكيانات المدارة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top