全部,
有谁知道我如何指导 SqlQuery 类为 上返回的列使用别名非受管实体 询问?
我正在尝试使用 SqlQuery Hibernate 类来创建非实体 POJO 的列表,但是在尝试为 SQL 查询中的列设置别名时遇到了麻烦。当我尝试在我的 sql 中添加别名(例如 SELECT o.id as orderId, ps.code as prescriptionStatus...
)时,hibernate 提示它找不到列“x”,其中列“x”是非别名列名(例如“id”而不是“orderId” ”)。
如果我不为返回的列设置别名,一切都很好,但是我的 POJO 被迫具有具有非别名字段名称的属性,或者我必须管理 POJO 中的映射(具有良好名称的 getter 返回非别名字段)字段名称)。
这是我的代码
//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;
谢谢!
最佳答案
您可以使用 addScalar(String columnAlias, Type type)显式别名您的 native SQL 的列:
例如 :
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
的类。使用名为 setPrescriptionId()
的 setter , setPrescriptionStatus()
etc ,并通过这些 setter 将结果填充到其实例中。
关于Hibernate:如何为非实体 Sql 查询的列设置别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8140076/