【问题标题】:Hibernate doesn't return proper objects in inner joinHibernate 在内连接中不返回正确的对象
【发布时间】:2025-12-02 16:15:02
【问题描述】:

我正在开发使用 Hibernate 的 Spring MVC 应用程序。我在 SQL 中的一个请求如下所示:

SELECT work_order.* FROM work_order
inner join user
on
work_order.user_id = user.id
and
user.user_name = 'Jenna'

我确实得到了一排工单的结果。当我尝试对 Hibernate 执行相同操作时,我得到了五个对象(这是正确的),但无法转换为 WorkoOrder 对象。 这是我的休眠请求:

List<WorkOrder> workorders =  (List<WorkOrder>)currentSession.createQuery(
"from WorkOrder w inner join w.user as u where user_name=:tempName")
.setParameter("tempName", tempName).getResultList();

其中 tempName 是一个参数。我确实得到了对象,但不能将它们转换为 Workorder,可能是因为 Hibernate 返回 Workorders 和 Users 的组合。如何解决此问题,以便仅返回 Workorders? 更新:用户在 WorkOrder 中映射

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="user_id", nullable = true)
private User user;

【问题讨论】:

  • 如果在您的 WorkOrder 模型中您没有映射用户,我建议您这样做
  • 共享您的 WorkOrder 和 User 实体。 "work_order.user_id = user.id" 连接应该由您在那里定义的关系映射来处理。
  • @cristianorbs 我确实在我的 WorkOrder 中映射了用户
  • 您能否将您的 HQL 查询更改为 select w from WorkOrder w inner join w.user as u where user_name=:tempName 并再次测试。我知道你可以忽略 HQL 中的 select 子句,但我更喜欢它。

标签: java mysql hibernate spring-mvc


【解决方案1】:

您的 HQL 没有 select 子句。如果您只想要加入表单中的 WorkOrder 实体,那么您需要告诉 Hibernate:

currentSession.createQuery(
        "select w from WorkOrder w inner join w.user as u where u.user_name=:tempName")

【讨论】:

  • 他们可以将查询更改为from WorkOrder w where w.user.user_name = :tempName;但我更喜欢选择子句。
  • John,它成功了,我得到了可读的 WorkOrder 对象。在我尝试使用“Select WorkOrder from...”之前
  • 确认,@AmirPashazadeh,但尽管这会产生相同的结果,但它在语义上并不等效。 OP 形成一个连接,从中选择他的结果(即使他省略了 select 子句),而您的替代方案则在 where 子句中使用子查询。原则上,两者不一定产生相同的查询计划。
最近更新 更多