【问题标题】:Hibernate, Associations not working休眠,关联不起作用
【发布时间】:2011-08-05 21:51:54
【问题描述】:

我有一个这样的模型

癫痫发作 => MatCountry => MatCountryI18n

当我尝试像这样查询数据时

criteria.
createAlias("matCountry","seizure_country",CriteriaSpecification.INNER_JOIN).       
createAlias("seizure_country.matCountryI18ns","seizure_country_translation",CriteriaSpecification.INNER_JOIN).
add(Restrictions.eq("seizure_country_translation.matLanguageCode", "de").
setFetchMode("seizure_country", FetchMode.JOIN).
setFetchMode("seizure_country_translation", FetchMode.JOIN);

并从数据库中获取数据

List<Seizure> seizures = getHibernateTemplate().findByCriteria(criteria);

我希望 hibernate 只给我那些与我的给定查询匹配的对象(特别是那些子对象)(其中 translation.matLanguageCode = de)

但是当我访问 MatCountryI18n

的子对象时
logger.info("Seizures: "+seizures.get(0).getMatCountry().getMatCountryI18ns().size());

它给了我 ALL 相关联的 MatCountryI18n 对象 MatCountry

请帮忙。

我做错了什么。

问候 JS

【问题讨论】:

    标签: hibernate associations one-to-many


    【解决方案1】:

    您要求 hibernate 为您提供所有具有 MatCountry 的 Seizur,这些 Seizur 具有一个或多个 MatCountryI18n 且 matLanguageCode == 'de'。这正是你得到的。

    听起来您只想使用 matLanguageCode == 'de' 选择特定的 MatCountryI18n。我会通过使用 MatCountryI18n 的标准凝视您的选择并按照您现在正在做的相反顺序通过您的关联获取 Seizurs 来做到这一点。以编程方式或通过ResultTransformer

    【讨论】:

    • 我的用例是我想要一份所有癫痫发作的列表、他们的国家和该国家/地区的适当翻译(即英文)
    • 我明白,但您正在做的是选择带有一些连接的 Seizurs 以及这些连接上的 where 语句。当您访问 MatCountry 时,Hibernate 将返回 Seizurs 并使用您的正常映射关联。这就是为什么我建议选择 MatCountryI18n 并通过反向关联构建您的 List 以从中返回。或者,使用自定义 ResultTransformer。
    • 谢谢,我将使用 docs.jboss.org/hibernate/core/3.3/reference/en/html/… 中描述的 ResultTransformer
    • 酷!它甚至不必是定制的。谢谢,我在这里也学到了一些新东西:)
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2015-10-28
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多