2011-11-15 10 views
6

すべて、 Hibernate:非エンティティSqlクエリの列をエイリアスする方法

は、誰もが、私は列のエイリアスを使用するのSQLQueryクラスを指示することができます方法を知っていますが 非管理エンティティクエリに戻りましたか?

非エンティティPOJOのリストを作成するのにSqlQuery Hibernateクラスを使用しようとしていますが、SQLクエリの列をエイリアスしようとすると問題が発生しています。私のSQLにエイリアスを入れようとすると(例えばSELECT o.id as orderId, ps.code as prescriptionStatus...)、hibernateはカラム "x"を見つけることができないと訴えます。 "x"はエイリアスではないカラム名です(例えば "orderId"ではなく "id")。 。

返された列のエイリアスがない場合は、すべて正常ですが、POJOは非エイリアスのフィールド名を持つプロパティを強制的に持つか、POJO内のマッピングを管理する必要があります非エイリアスのフィールド名)。

は、ここに私のコードです

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

あなたのネイティブSQLの列エイリアスに明示的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というクラスを探しますがsetPrescriptionStatus()など、setPrescriptionId()と呼ばれますこれらのセッターを介してインスタンスに結果を移入します。

+0

優秀!ありがとうございました。これを名前付きクエリに変換する場合は、スカラーを指定できることがわかります。 –

関連する問題