Java JPQL-在查询中投影@Embeddeble对象
假设我的域类中有以下内容:Java JPQL-在查询中投影@Embeddeble对象,java,hibernate,jpql,dto,mapstruct,Java,Hibernate,Jpql,Dto,Mapstruct,假设我的域类中有以下内容: class A{ private Integer id; private Embded e; } @Embeddable class Embded{ private String emb; } 这是我的DTO课程: class ADto{ private Integer id; private Embded e; } class EmbdedDto{ private String emb; } 是否可以查询内部Embded对象作为emb
class A{
private Integer id;
private Embded e;
}
@Embeddable
class Embded{
private String emb;
}
这是我的DTO课程:
class ADto{
private Integer id;
private Embded e;
}
class EmbdedDto{
private String emb;
}
是否可以查询内部Embded
对象作为embddto
的投影?大概是这样的:
@Query("SELECT new namespace.ADto(a.id, new namespace.EmbdedDto(a.e.emb)) FROM A a");
是否可以使用
MapStruct
或类似工具自动执行此操作?只需创建一个具有可嵌入键参数的构造函数,如下所示:
class ADto{
private Integer id;
private EmbdedDto e;
public ADto(Integer id, String emb) {
this.id = id;
this.e = new EmbdedDto(emb);
}
}
@Embeddable
class EmbdedDto{
private String emb;
public EmbdedDto(String emb) {
this.emb = emb;
}
}
现在您可以:
@Query("SELECT new namespace.ADto(a.id, a.e.emb) FROM A a");
您可以使用MapStruct将
A
映射到ADto
(猜测ADto
中有一个打字错误,您的意思是包含EmbeddedDto
,而不是Embedded
)
只需定义一个映射器
@Mapper
公共接口映射器{
SomeMapper实例=Mappers.getMapper(SomeMapper.class);
ADto地图(A英寸);
}
Mapstruct还将自动为Embedded
到EmbeddedDto
不确定这在JPQL中是否可行(我不熟悉这里,但从您的示例中可以调用java),但您可以尝试:
@Query(“从a中选择SomeMapper.INSTANCE.map(a));
这更像是一种解决方法。。。在现实世界的代码中可能有50个参数的构造函数。您可以使用lombok及其酷炫的功能,如@allargsconstuctor
和@Builder