Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPQL-在查询中投影@Embeddeble对象_Java_Hibernate_Jpql_Dto_Mapstruct - Fatal编程技术网

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