Blaze Persistence实体视图集合类型重映射问题求助
解决方案
问题出在@MappingIndex的属性路径未关联到集合元素的属性上。Blaze Persistence默认会从主实体(ConfigurationEntity)查找指定属性,而你需要从关联的DescriptionEntity中获取属性,因此需要明确指定集合元素的属性路径,或通过@Mapping先绑定目标集合,再用@MappingIndex指定元素的键属性。
正确的实体视图写法
要实现将List<DescriptionEntity>转为以language为键的Map<String, DescriptionView>,需按以下方式编写:
- 用
@Mapping指定Map对应的源集合(descriptions) - 用
@MappingIndex指定集合元素(DescriptionEntity)的键属性路径(identifier.language)
完整代码示例:
@EntityView(ConfigurationEntity.class) public interface InstitutionView { @IdMapping(value = "institution") UUID getIdentifier(); // 可选:保留原List映射 List<DescriptionView> getDescriptions(); @Mapping("descriptions") @MappingIndex("identifier.language") Map<String, DescriptionView> getDescriptionMap(); }
关键说明
@Mapping("descriptions"):告知Blaze Persistence该Map是基于主实体的descriptions集合转换而来@MappingIndex("identifier.language"):指定使用集合元素(DescriptionEntity)中identifier嵌入类的language属性作为Map的键
额外修正:实体关联类型错误
你的DescriptionEntity中configuration字段的类型写为InstitutionConfigurationEntity,但主实体类是ConfigurationEntity,这是笔误会导致Hibernate关联失败,需修正为:
@ManyToOne(fetch = FetchType.LAZY) @MapsId("identifier_institution") @JoinColumn(name = "identifier_institution") private ConfigurationEntity configuration;
内容的提问来源于stack exchange,提问作者Hickory
相关产品推荐
相关产品推荐

