如何解决如何加入获取Map-ElementCollection的键的LAZY字段?
我有我的文档实体。它具有一些字段,并且该字段:
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "document_external_dispatches",joinColumns = @JoinColumn(name = "document_id"))
@MapKeyJoinColumn(name = "external_dispatch_id")
@Column(name = "is_active")
private Map<ExternalDispatch,Boolean> externalDispatches;
我的ExternalDispact-entity具有LAZY字段公司:
@NotNull(message = "Company must not be empty")
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
private Company company;
所以我想通过具有externalDispatches映射的ID查找文档。我希望我的外部派遣能够与现场公司一起获得。 我尝试编写此查询,但这不起作用:
@Query("select d from Document d left join fetch d.externalDispatches externals join fetch key(externals).company where d.id=:id")
请帮助我为此编写查询
解决方法
目前这是不可能的,似乎JPA规范也无法解决这个问题。这里供参考:https://hibernate.atlassian.net/browse/HHH-11433
不过,您可以使用DTO来编写适当的查询,而不是执行提取联接。像这样:
select d.id,d.name,ex.id,c.id,c.name
from Document d
left join d.externalDispatches e
left join ExternalDispatch ex on ex.id = key(e).id
left join ex.company c
where d.id = :id
话虽如此,这是Blaze-Persistence Entity Views的完美用例。
我创建了该库,以允许在JPA模型与自定义接口或抽象类定义的模型之间轻松进行映射,例如类固醇上的Spring Data Projections。这个想法是,您可以按自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(获取器)映射到实体模型。
用于查询的DTO模型与Blaze-Persistence Entity-Views相似如下:
@EntityView(Document.class)
public interface DocumentDto {
@IdMapping
Long getId();
String getName();
@Mapping("this")
Set<ExternalDispatchDto> getExternalDispatches();
@EntityView(Document.class)
interface ExternalDispatchDto {
@Mapping("KEY(externalDispatches).company")
CompanyDto getCompany();
@Mapping("externalDispatches")
Boolean getDispatch();
}
@EntityView(Company.class)
interface CompanyDto {
@IdMapping
Long getId();
String getName();
}
}
查询是将实体视图应用于查询的问题,最简单的方法就是按ID查询。
DocumentDto d = entityViewManager.find(entityManager,DocumentDto.class,id);
Spring Data集成使您可以像使用Spring Data Projections一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。