【问题标题】:Spring Data DTO projectionSpring Data DTO 投影
【发布时间】:2018-03-05 10:17:39
【问题描述】:

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

PersonDto

@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 文档中的示例,我们没有看到此案例的示例,但我们也没有看到明确声明这 不是支持

【问题讨论】:

    标签: hibernate spring-data spring-data-jpa


    【解决方案1】:

    来自Spring Data JPA - Reference Documentation

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

    我认为原因是这样的......

    【讨论】:

    • 嗯,不知怎的,我们错过了那部分。
    【解决方案2】:

    您正在使用@AllArgsConstructor 注释。

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

    所以不存在无参数构造函数。

    您可以更新您的回购方法:

    List<PersonDto> findAllDtoedBy();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-15
      • 2021-03-22
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多