一尘不染

使用内部联接使用Hibernate返回多个对象类型

hibernate

在hibernate状态下,查询似乎有些困难。我正在两个表上执行内部联接。

SELECT * FROM product p INNER JOIN warehouse w ON p.wid = w.id

产品表:

id | name | wid | price | stock .....

仓库表:

id | name | city | lat | long .....

联接结果:

id | name | wid | price | stock | id | name | city | lat | long .....

当我运行查询..

Session.createSQLQuery(this.query)
        .addEntity("p", Product.class)
        .addEntity("w", Warehouse.class).list();

因此,对于每个结果,我都会得到一个包含a Product object和a 的对象Warehouse object

这是预期的。问题是hibernate将产品的ID和名称分配给仓库对象的ID和名称属性。在创建Warehouse项目时,好像联接结果中的前两列已经结束了。产品对象始终包含正确的数据。

关于解决此问题的任何建议,以便表示正确仓库数据的id和name列将不胜感激。

提前致谢。


阅读 195

收藏
2020-06-20

共1个答案

一尘不染

使用{}表格来避免列名重复的问题:

SELECT {p.*}, {w.*} FROM product p INNER JOIN warehouse w ON p.wid = w.id

摘自《 Hibernate参考文档》第18.1.4节。返回多个实体:

到目前为止,假定结果集的列名与映射文档中指定的列名相同。这对于连接多个表的SQL查询可能会造成问题,因为相同的列名可能出现在多个表中。

在以下查询中需要使用列别名注入(很可能会失败):

sess.createSQLQuery("SELECT c.*, m.*  FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
 .addEntity("cat", Cat.class)
 .addEntity("mother", Cat.class)

该查询旨在每行返回两个Cat实例:一个cat及其它的母亲。但是,查询将失败,因为名称冲突。实例被映射到相同的列名。同样,在某些数据库上,返回的列别名很可能采用“
c.ID”,“ c.NAME”等形式,它们不等于映射中指定的列(“ ID”和“ NAME”) 。

以下形式不易受到列名重复的影响:

sess.createSQLQuery("SELECT {cat.*}, {mother.*}  FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
 .addEntity("cat", Cat.class)
 .addEntity("mother", Cat.class)

该查询指定:

SQL查询字符串,带有用于Hibernate的占位符,以插入列别名作为查询返回的实体。上面使用的{cat.*}and
{mother.*}表示法是“所有属性”的简写。

2020-06-20