【问题标题】:Hibernate: Eager fetching / help me survive my hibernate nightmare休眠:渴望获取/帮助我度过我的休眠噩梦
【发布时间】:2012-10-29 00:16:56
【问题描述】:

我正在尝试使用以下 HQL 语句返回对象列表:

return getHibernateTemplate().findByNamedParam("Select distinct response.user
    from Survey survey
    inner join fetch survey.surveyDates surveyDate
    inner join fetch surveyDate.responses response
    where survey.id = :surveyId)", "surveyId", surveyId);

下面的错误让我抓狂:

HTTP 状态 500 - 查询指定连接提取,但提取关联的所有者不在选择列表中

所以我尝试在我的代码中不使用“fetch”这个词。然后我的返回列表是空的。

应用程序就像涂鸦,数据库看起来像这样:

Survey 有一个列表surveyDates
SurveyDate 有一个回复列表
响应有一个属性 user

我的任务是:该方法有一个参数surveyId 并返回所有响应它的用户。所以我们要一直往下走Survey-->surveyDates-->responses-->user

我想这对你来说很容易,我是 SQL 新手,甚至是 Hibernate 新手!

【问题讨论】:

    标签: hibernate hql fetch lazy-evaluation eager


    【解决方案1】:

    您的查询似乎不正确:如果您期望用户列表,您应该从用户开始您的子句(但由于您没有提供任何映射,我只是希望您在用户和响应之间建立了反比关系,并且等等)

    这样的东西应该会更好:

    from user u
    inner join u.responses as response 
    inner join response.surveydates as surveydates
    inner join surveydates.survey as survey
    where survey.id = :surveyId
    

    【讨论】:

    • 不幸的是没有反比关系..所以这行不通。还有可能吗?
    • 这取决于您的对象模型(而不是您的数据库):用户是否在您的对象模型中持有对 Response 的引用? .如果您没有对来自用户的响应的引用,那么您将无法仅获得用户列表。因为用户永远不会知道其响应的 ID 是什么。
    • 感谢您的意见。实际上,用户没有任何引用。它是一条单向街道。只有 Response 持有对用户的引用...看起来这不是最好的主意,对吧?
    • 哦,实际上我能做到的:在数据库本身(H2,如果这很重要)上,我能够执行一条 SQL 语句,它准确地返回了我想要的。但因此我需要关节。这里是:SELECT distinct res.user_id FROM SURVEY sur, SURVEY_SURVEYDATE sur_surdate, SURVEYDATE_RESPONSE sur_res, RESPONSE res WHERE sur.id = 1 and sur.id = sur_surdate.survey_id and sur_surdate.surveydates_ID = sur_res.surveydate_id and sur_res.responses_id = res。 id(sur.Id = 1只是为了测试而不是参数)但是在hibernate中没有办法做到这一点?
    • 我在您的查询中没有看到任何关于用户的联接,所以这不是您要查找的内容。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多