2011-11-15 14 views
6

,Hibernate: ¿cómo alias una columna para una consulta SQL sin entidad? Todo

¿Alguien sabe cómo puedo dirigir la clase SQLQuery utilizar los alias de columnas devueltos en una entidad gestionada para no consulta ?

Estoy intentando utilizar la clase SqlQuery Hibernate para crear una Lista de POJO sin entidad, pero estoy teniendo problemas para tratar de alias las columnas en la consulta SQL. Cuando intento poner alias en mi sql (por ejemplo, SELECT o.id as orderId, ps.code as prescriptionStatus...), hibernate se queja de que no puede encontrar la columna "x", donde la columna "x" es el nombre de columna sin alias (por ejemplo, "id" en lugar de "orderId") .

Si no aligo mis columnas devueltas, todo está bien, pero mi POJO se ve forzado a tener propiedades con los nombres de campos sin alias, o tengo que administrar las asignaciones dentro del POJO (retornadores con buenos nombres) los nombres de campo sin alias).

Aquí está mi código

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

Gracias!

Respuesta

9

Puede utilizar addScalar(String columnAlias, Type type) explícitamente alias de las columnas de su SQL nativo:

Por ejemplo:

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; 

El transformador será entonces buscar una clase llamada RelatedPrescriptionOrderLine con el colocador llama setPrescriptionId(), setPrescriptionStatus() etc. y rellene el resultado a su instancia a través de estos setters.

+0

¡Excelente! Gracias. Veo que puede especificar escalares si tuviera que convertir esto a una consulta con nombre. –

Cuestiones relacionadas