如何获取通过@MapKeyColumn映射的@ElementCollection表的内容

时间:2019-06-17 12:52:31

标签: java performance hibernate jpa

这里有很多与此类似的问题,但是经过大量查找,我没有找到这个问题或答案。

我有一个实体,其@ElementCollection映射如下:

@Entity
public class MyEntity {
    ...
    @ElementCollection(fetch = FetchType.EAGER)
    @MapKeyColumn(name = "value")
    @Column(name = "description")
    private Map<String, String> validValues = new HashMap<>();

    @Column
    protected Long otherId;

此配置工作正常,我没有为映射表指定名称,但是Hibernate从映射中自动创建了该名称并将其命名为my_entity_valid_values。对于每个MyEntity实例,通过Hibernate来获取这些值都可以正常工作,问题在于大型数据集的性能。

在我的应用程序中,我可以拥有MyEntity对象的大量集合,而不是依靠Hibernate的热切获取来产生n查询,而我想自己获取它们。我正在尝试此HQL:

select e.id,vv from MyEntity e join e.validValues vv where e.otherId=14

这将导致以下SQL:

select
    myentity0_.id as col_0_0_,
    validvalue1_.description as col_1_0_ 
from
    my_entity myentity0_ 
inner join
    my_entity_valid_values validvalue1_ 
        on myentity0_.id=validvalue1_.my_entity_id 
where
    myentity0_.other_id=14

由Hibernate创建的my_entity_valid_values表具有3列,my_entity_id是返回源表的外键,还有valuedescription列两列代表Map<String, String>映射的键和值。

但是,从HQL中的vv引用生成的SQL仅包含description列,该列省略了value列并提供了该数据的不完整图片。在这种情况下,如何同时获得valuedescription列?我已经尝试过HQL,例如:

select e.id,vv.value,vv.description ...

但这给了我org.hibernate.QueryException: cannot dereference scalar collection element

欢迎任何提示!

1 个答案:

答案 0 :(得分:1)

感谢this answer in another question,我想出了答案,答案是像这样用index()引用收集列:

select e.id,index(vv),vv from MyEntity e join e.validValues vv where e.otherId=14

这将添加value列(在我的情况下,该列传递到@MapKeyColumn)并返回查询中我需要的所有数据。