当前位置: 首页 > 面试题库 >

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

黄骏喆
2023-03-14
问题内容

在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列将不胜感激。

提前致谢。


问题答案:

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

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.*}表示法是“所有属性”的简写。



 类似资料:
  • 问题内容: 我是Hibernate和Criteria Query的新手。所以我在HQL中实现了查询: 如何使用hibernate条件对象实现它? 问题答案: 您的示例只是本机SQL,而不是HQL。无论如何,您可以使用Criteria API中的以下方法来构造所需的Criteria对象: 使用setProjection(Projection projection)定义select子句 使用creat

  • 我想使用联接表在两个表之间建立一对多关系。 这就是为什么我想使用联接表: Hibernate单向一对多关联-为什么连接表更好 最后,我想使用Hibernate注释来执行此操作。 我找到了一些使用xml映射实现这一点的示例,但没有使用注释。 我相信这将是如何创建表需要

  • 问题内容: 我正在尝试序列化以序列化下面包含的json字符串。 我正在使用此gson调用对其进行序列化 我的班主任就是这样。 对于任何其他类变量,它都是这样。当我尝试使用上述调用时,最终会得到具有所有空值的对象。要注意的一件事是json字符串中未提供某些字段,因为不同的api调用提供了这些json字符串的不同部分。我做错了什么? 问题答案: 您提供的JSON根对象具有属性-因此,您有两个选项可以使

  • 我想使用Hibernate条件语言编写此查询。我对Hibernate很陌生,无法将此查询转换为条件形式。我参考了很多关于 SO 的答案,但就我而言,我在不同的列上使用内部连接而不是主键/外键列。我提到了这个,但仍然不能正确。

  • 所以我有一个相关的子查询,我读到这不是最有效的方法。因此,我想将此查询转换为内部联接查询。 我试过这样的方法: 在对数据库“db”执行SQL查询时导致 我在这里的所有搜索结果都产生了大致相同的查询(与我尝试的类似)

  • 我试图在一列内连接两个表。从数据库方面来看,没有映射,因为这是我不想讨论的事情。 我想使用内部联接执行HQL查询并检索角色对象/结果。 这是到目前为止我的hql 一场createQuery(“从角色作为角色内部加入参与作为角色上的参与。id=invention.roleid,其中invention.id=X”)。list(); 我看到在HQL上不可用。如何明确地告诉Hibernate仅加入此列。