2011-11-15 26 views
6

Tất cả,Hibernate: Làm thế nào để bí danh một cột cho một truy vấn SQL không thực thể?

Có ai biết cách tôi có thể hướng dẫn lớp SqlQuery sử dụng bí danh cho các cột được trả lại trên một truy vấn Không được quản lý thực thể không?

Tôi đang cố gắng sử dụng lớp SqlQuery Hibernate để tạo danh sách POJO không phải của thực thể, nhưng đang gặp sự cố khi cố gắng đặt bí danh các cột trong truy vấn SQL. Khi tôi cố gắng đặt bí danh trong sql của tôi (ví dụ: SELECT o.id as orderId, ps.code as prescriptionStatus...), hibernate than phiền rằng nó không thể tìm cột "x", trong đó cột "x" là tên cột không có bí danh (ví dụ: "id" thay vì "orderId") .

Nếu tôi không bí danh các cột được trả về, tất cả đều tốt, nhưng POJO của tôi sau đó bị buộc phải có thuộc tính với tên trường không được đặt bí danh hoặc tôi phải quản lý ánh xạ trong POJO (getters với tên đẹp tên trường không có bí danh).

Dưới đây là mã của tôi

//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; 

Cảm ơn bạn!

Trả lời

9

Bạn có thể sử dụng addScalar(String columnAlias, Type type) đến một cách rõ ràng bí danh cột của SQL mẹ đẻ của bạn:

Ví dụ:

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; 

Các biến sau đó sẽ tìm kiếm một lớp được gọi là RelatedPrescriptionOrderLine với setter gọi setPrescriptionId(), setPrescriptionStatus() vv và điền kết quả vào thể hiện của nó thông qua các trình cài đặt này.

+0

Tuyệt vời! Cảm ơn bạn. Tôi thấy rằng bạn có thể chỉ định vô hướng nếu tôi chuyển đổi thành một truy vấn được đặt tên. –

Các vấn đề liên quan