这里有很多与此类似的问题,但是经过大量查找,我没有找到这个问题或答案。
我有一个实体,其@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
是返回源表的外键,还有value
和description
列两列代表Map<String, String>
映射的键和值。
但是,从HQL中的vv
引用生成的SQL仅包含description
列,该列省略了value
列并提供了该数据的不完整图片。在这种情况下,如何同时获得value
和description
列?我已经尝试过HQL,例如:
select e.id,vv.value,vv.description ...
但这给了我org.hibernate.QueryException: cannot dereference scalar collection element
。
欢迎任何提示!
答案 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
)并返回查询中我需要的所有数据。