JPQL-在查询中投射@Embeddable对象

时间:2019-06-21 09:43:48

标签: 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对象作为EmbdedDto的投影?像这样:

@Query("SELECT new namespace.ADto(a.id, new namespace.EmbdedDto(a.e.emb)) FROM A a");

是否可以使用MapStruct或类似的方法自动执行此操作?

2 个答案:

答案 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还将自动为EmbeddedEmbeddedDto生成方法

不确定在JPQL中是否可行(我在这里不太熟悉,但是从您的示例中可以调用java),但是您可以尝试:

@Query("SELECT SomeMapper.INSTANCE.map(a) FROM A a");