【问题标题】:Hibernate 5: how to join a HashMap in the HQL?Hibernate 5:如何在 HQL 中加入 HashMap?
【发布时间】:2016-03-28 01:04:42
【问题描述】:

假设,我有一个实体 Country extends Entity。每个实体都应该有某种元数据(翻译、描述、创建日期等...)。

public abstract class Entity<T> implements Serializable {
    protected Map<Language,EntityMetaData> metaData;
    // constructors, setters, getters etc.
}

public class Country extends Entity<Long> implements Serializable {
    // some fields
    // constructors, setters, getters etc.
}

public class EntityMetaData extends Entity<Long> implements Serializable {
    private String name;
    private String description;
    private Language language;
    // constructors, setters, getters etc.
}

这是我对国家/地区的映射:

<class name="Country" table="COUNTRIES" schema="EDRIVE" dynamic-update="false" dynamic-insert="true" batch-size="30">
    <meta attribute="class-description">
        This class contains countries
    </meta>
    <id name="id" type="long" column="id">
        <generator class="identity" />
    </id>
    <property name="isoCode2" column="isocode2" type="string" length="2"/>
    <property name="isoCode3" column="isocode3" type="string" length="3"/>
    <property name="telephoneCode" column="telephonecode" type="int"/>
    <property name="timezone" column="timezone" type="boolean"/>
    <!--+
        | CountriesMetaData
        +-->
    <map name="metaData" fetch="join" cascade="all" batch-size="10" table="CountriesMetaData">
        <key column="entityId"/>
        <map-key-many-to-many column="languageId" class="Language"/>
        <one-to-many entity-name="countriesMetaData"/>
    </map>
</class>

对于 EntityMetaData:

<class name="EntityMetaData" entity-name="countriesMetaData" table="COUNTRIESMETADATA" lazy="false">
    <id name="id" type="long" column="id" access="field">
        <generator class="identity" />
    </id>
    <property name="name" column="name" type="string" length="256" />
    <property name="description" column="description" type="string" length="512"/>
    <many-to-one name="language" class="Language" column="languageid" not-null="true"/>
</class>

所以,我需要的是:我想要一个包含所有元数据的国家/地区列表。我使用以下 HQL:

List<Country> countryList = (List<Country>)databaseUtilities.getSession()
            .createQuery("FROM Country c JOIN FETCH c.metaData m")
            .list();

Hibernate 也选择了所有内容(我什至看到所有集合都在调试中初始化),但 Country.metaData 仍然是 PersistentMap(而不是我想要的 HashMap),当我尝试时收到 null:

EntityMetaData entityMetaData = metaData.get(locale.getDisplayName());
                                ^^^^^^^^^^^^   

如何解决这个问题?

谢谢。

附:休眠 5.0.3.Final

【问题讨论】:

    标签: hibernate join hql hibernate-mapping


    【解决方案1】:

    PersistentMap 是 Map 的包装器,您可以轻松检索它。你试过了吗?

    Map metaData = country.getMetaData();

    【讨论】:

    • 是的,我做到了。它返回 PersistentMap。
    • 在事务内部,在执行查询之后? PersistentMap 将会话和地图包装在一起。您需要会话对象从包装中提取地图。
    • 我明白你的意思。我正在重写我的 DAOImpl 类,以便在一个事务中执行转换。详情请见stackoverflow.com/questions/21703851/…
    猜你喜欢
    • 2016-11-23
    • 2013-02-07
    • 2011-09-14
    • 2016-06-24
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多