【问题标题】:hibernate - query return typehibernate - 查询返回类型
【发布时间】:2011-09-14 18:53:42
【问题描述】:

我有一个(相对)简单的 HQL 查询,它返回两个连接的实体,它们具有一对多的关系。 作为查询的结果,我想获取 entity1 类型的列表,其中 entity1.entity2 进行了映射。 因为我在结果集中得到一个笛卡尔积,对于每个 entity2(多面)我有 1 行,我得到 entity1 的重复项。 因此,如果我 list() 结果,我会得到重复的条目。

为了解决这个问题,我使用query.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY );

然而,这并不总是返回一个 rntity1 的列表,而是有时返回一个 entity2 的列表。

有没有办法指定 ResultSet 的“主要”实体?

【问题讨论】:

  • 'SELECT msg FROM com.intelerad.hibernate.spike.models.Messages AS msg LEFT JOIN feetch msg.commands AS cmd WITH ( lower( cmd.status ) = \'failed\' )' 给出"with-clause not allowed on fetched associations;"
  • 'SELECT msg, cmd FROM Messages AS msg LEFT JOIN msg.commands AS cmd WITH (lower( cmd.status ) = failed )' 返回错误的根实体(命令而不是消息)

标签: hibernate mapping hibernate-mapping


【解决方案1】:

您的第二个查询要求同时返回消息和命令,这就是您获得这两种类型的对象的原因。让它返回味精。

您应该能够将所需的 WITH 移动到 WHERE 子句中

SELECT msg FROM Messages AS msg LEFT JOIN FETCH msg.commands AS cmd WHERE( lower( cmd.status ) = 'failed' )

【讨论】:

  • 这不是我想要的。 “LEFT JOIN FETCH msg.commands ON lower(cmd.status) = 'failed'”和“LEFT JOIN FETCH msg.commands WHERE lower(cmd.status) = 'failed'”之间存在显着差异。第一个将返回消息的子集,仅返回 sendCommands 失败的消息,而另一个将返回所有消息,仅返回 sendCommands 的子集
  • 我已经在 SQL 中完成了 LEFT JOIN ON 子句 1 和子句 2 并且它有效 - 我只需要在 HQL 中使用它
  • 这是我知道我过去可以通过 HQL 实现的其中一件事,而我现在是如何做到的。我得稍微研究一下。
  • 您不能在 HQL 中执行 LEFT JOIN FETCH WITH,因为 Hibernate 希望集合与数据库匹配。它要么完全填充,要么根本没有获取。我现在无法对此进行测试,但您收到的错误不是建议您尝试过滤器吗?
猜你喜欢
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2011-05-27
  • 2019-08-13
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多