让我说我的域类有这个
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
对象作为EmbdedDto
的投影?像这样:
@Query("SELECT new namespace.ADto(a.id, new namespace.EmbdedDto(a.e.emb)) FROM A a");
是否可以使用MapStruct
或类似的方法自动执行此操作?
答案 0 :(得分:1)
只需创建具有可嵌入键参数的构造函数,就像这样:
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");
答案 1 :(得分:0)
您可以使用MapStruct将A
映射到ADto
(猜想ADto
中有一个错字,并且您打算包含EmbeddedDto
而不是Embedded
。 )
只需定义一个映射器
@Mapper
public interface SomeMapper {
SomeMapper INSTANCE = Mappers.getMapper(SomeMapper.class);
ADto map(A in);
}
Mapstruct还将自动为Embedded
至EmbeddedDto
生成方法
不确定在JPQL中是否可行(我在这里不太熟悉,但是从您的示例中可以调用java),但是您可以尝试:
@Query("SELECT SomeMapper.INSTANCE.map(a) FROM A a");