Hibernate:如何为非实体 Sql 查询的列设置别名?

标签 hibernate

全部,

有谁知道我如何指导 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/

相关文章:

java - 没有 session.getTransaction 方法不存在

java - Hibernate 复合键是另一个表的外键

java - 这个实体模型的HQL?

java - hibernate.hbm2ddl.import_files : Path to the files

java - JPA 和 Postgres generate_series

java - hibernate 条件 : NOW() < date + 1 day

Hibernate aliasToBean不会将字符串转换为Enum

java - 使用 hibernate 以两个列表作为参数从数据库获取对象

sql-server - 两个不同数据库之间的主键-外键关系

spring - 实体 : Autowired is null 中的计算字段