Spring Data DTO投影

7
我们希望在接口方面使用DTO投影,因此我们创建了以下的DTO对象:
@Data
@Builder
@AllArgsConstructor
public class PersonDto {

    private String name;

    private String email;

    private AddressDto address;

}

地址传输对象

@Data
@Builder
@AllArgsConstructor
public class AddressDto {

    private String address;

    private String streetNumber;

}

一个代码库

@Repository
public interface PersonRepository extends JpaRepository<PersonEntity, Long> {

    List<PersonDto> findAllDtoedBy();

}

但是,当调用时我们会收到异常:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.example.projections.model.PersonDto]. Expected arguments are: java.lang.String, java.lang.String, com.example.projections.model.AddressEntity [select new com.example.projections.model.PersonDto(generatedAlias0.name, generatedAlias0.email, address) from com.example.projections.model.PersonEntity as generatedAlias0 left join generatedAlias0.address as address]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.2.11.Final.jar:5.2.11.Final]
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) ~[hibernate-core-5.2.11.Final.jar:5.2.11.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:272) ~[hibernate-core-5.2.11.Final.jar:5.2.11.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.2.11.Final.jar:5.2.11.Final]

请注意这行文字:“……期望的参数是:java.lang.String、java.lang.String和com.example.projections.model.AddressEntity……”。显然,它期望一个模型对象AddressEntity,但当找到DTO对象(AddressDto)时会感到困惑。
因此,问题是,既然这适用于接口投影,我们也希望DTO投影也能被支持吗?通过查看GitHub上的示例(https://github.com/spring-projects/spring-data-examples/blob/master/jpa/example/src/main/java/example/springdata/jpa/projections/CustomerRepository.java)和Spring Data JPA文档中的示例,我们没有看到这种情况的例子,但我们也没有看到明确说明不支持这种情况。
2个回答

9

Spring Data JPA - 参考文档

另一种定义投影的方法是使用值类型DTO,该DTO包含用于检索字段的属性。这些DTO类型可以与投影接口完全相同地使用,但这里没有代理操作,也不能应用嵌套投影。

我认为原因是...


哎呀,不知怎么的我们漏掉了那部分。 - Nikola Zarić

-3

你正在使用@AllArgsConstructor注释。

@AllArgsConstructor会为类中的每个字段生成一个带有1个参数的构造函数。

因此,没有无参构造函数存在。

您可以更新您的repo方法:

List<PersonDto> findAllDtoedBy();

在你的类中包含一些参数或提供一个无参构造函数。 (可能使用@NoArgsConstructor


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接