2011-11-15 16 views
6

Tutti,Hibernate: come aliasare una colonna per una query Sql non entità?

Qualcuno sa come posso dirigere la classe SQLQuery di utilizzare gli alias per le colonne restituito su un non gestito Entità interrogazione ?

Sto tentando di utilizzare la classe SqlQuery Hibernate per creare un elenco di POJO non entità, ma sto riscontrando problemi nel tentativo di creare un alias delle colonne nella query SQL. Quando tento di inserire alias nel mio sql (es. SELECT o.id as orderId, ps.code as prescriptionStatus...), hibernate si lamenta di non riuscire a trovare la colonna "x", dove la colonna "x" è il nome della colonna non con alias (es. "Id" invece di "orderId") .

Se non faccio l'alias delle mie colonne restituite, va tutto bene, ma il mio POJO è quindi forzato ad avere proprietà con i nomi di campo non con alias, o devo gestire i mapping all'interno del POJO (getter con nomi simpatici che ritornano i nomi dei campi non con alias).

Ecco il mio codice

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

Grazie!

risposta

9

È possibile utilizzare addScalar(String columnAlias, Type type) esplicitamente alias le colonne del vostro SQL nativo:

Ad esempio:

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; 

Il trasformatore sarà quindi cercare una classe chiamata RelatedPrescriptionOrderLine con il setter chiamato setPrescriptionId(), setPrescriptionStatus() ecc e compila il risultato alla sua istanza tramite questi setter.

+0

Eccellente! Grazie. Vedo che è possibile specificare scalari se dovessi convertire questo in una query denominata. –

Problemi correlati