Spring Data DTO 投影

2024-03-06

我们希望在接口一上使用 DTO 投影,因此我们创建了以下 DTO 对象:

人员Dto

@Data
@Builder
@AllArgsConstructor
public class PersonDto {

    private String name;

    private String email;

    private AddressDto address;

}

地址Dto

@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。地址实体...".

显然它需要模型对象地址实体,并且当 DTO 对象 (地址Dto) 被找到。

所以问题是,既然这适用于接口投影,我们是否期望 DTO 投影也支持它? 通过查看 GitHub 上的示例(https://github.com/spring-projects/spring-data-examples/blob/master/jpa/example/src/main/java/example/springdata/jpa/projections/CustomerRepository.java https://github.com/spring-projects/spring-data-examples/blob/master/jpa/example/src/main/java/example/springdata/jpa/projections/CustomerRepository.java)并且在 Spring Data JPA 文档中,我们没有看到这种情况的示例,但我们也没有看到明确的声明:isn't支持的


From Spring Data JPA - 参考文档 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections.dtos:

定义投影的另一种方法是使用值类型 DTO,它保存要检索的字段的属性。这些 DTO 类型的使用方式与投影接口的使用方式完全相同,只是此处不进行代理,并且没有嵌套可以应用预测。

我想原因是这样的...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data DTO 投影 的相关文章

随机推荐