使用复杂的 sqlquery 时如何使用 Hibernate 创建组合对象的映射?

Posted

技术标签:

【中文标题】使用复杂的 sqlquery 时如何使用 Hibernate 创建组合对象的映射?【英文标题】:How to create mapping of composed object with Hibernate when using a complex sqlquery? 【发布时间】:2015-08-14 10:37:11 【问题描述】:

我正在尝试将以下查询与 Hibernate 的 session.createSQLQuery 一起使用。 user对应的Entity对象有一个名为address的属性。 address 对象是由表 'user' 中的 5 个字段创建的。 如果我不使用 SQLQuery,它会自动填充。 但是,如果没有 SQLQuery,我将无法从下面显示的所需连接中获得所有信息。 用户实体对象还具有我正在使用

填充的 accessPlan 等属性
.addEntity("accessPlan", AccessPlan.class)

查询:

SELECT 
    user.*, 
    ap.*,
    country.*,
    auth.*, 
    GROUP_CONCAT(coup.code SEPARATOR ' ') coupons
FROM 
    user
    INNER JOIN access_plan ap ON (user.access_plan = ap.id)
    INNER JOIN country ON (user.country=country.code)
    LEFT JOIN user_auth auth ON (user.id = auth.userid)
    LEFT JOIN (
        SELECT 
                    trans.user_id,coupon.code
        FROM 
                    payments_transaction AS trans
        INNER JOIN payments_coupon coupon ON (trans.payments_coupon_id=coupon.id)
    ) coup ON (user.id=coup.user_id)    
GROUP BY user.id;

在使用 SQLQuery 时,填充组合 address 对象的最简单方法是什么? 有没有办法避免使用 SQLQuery 进行这样的查询?

【问题讨论】:

顺便说一句,此查询的结果应该是 List。我正在使用 .setResultTransformer(Transformers.aliasToBean(User.class)) 将每条记录转换为用户对象 顺便说一句 .. atuo-magic 部分实际上是使用了 @Embeddable 注释。 【参考方案1】:

请查看“Returning multiple entities”部分中的以下示例

String sql = "SELECT ID as c.id, NAME as c.name, " + 
     "BIRTHDATE as c.birthDate, MOTHER_ID as c.mother, mother.* " +
     "FROM CAT_LOG c, CAT_LOG m WHERE c.mother = c.ID";

List loggedCats = sess.createSQLQuery(sql)
    .addEntity("cat", Cat.class)
    .addEntity("mother", Cat.class).list()

在你的例子中,cat = user,mother = address...有点像。

目前我没有什么可以尝试的,但我想这会有所帮助。

【讨论】:

以上是关于使用复杂的 sqlquery 时如何使用 Hibernate 创建组合对象的映射?的主要内容,如果未能解决你的问题,请参考以下文章

使用 context.Object.SqlQuery 时返回匿名类型

使用 `db.Database.SqlQuery<model>` 后如何清除参数

获取“SqlParameter 已被另一个 SqlParameterCollection 包含。”使用 SqlQuery 命令时出错

如何最小起订量实体框架 SqlQuery 调用

ExecuteSqlCommand 与 SqlQuery 有啥区别?进行数据库访问时?

使用SQLQuery 在Hibernate中使用sql语句