Spring Data DTO投影

时间:2017-09-24 08:58:31

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

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

PersonDto

@Data
@Builder
@AllArgsConstructor
public class PersonDto {

    private String name;

    private String email;

    private AddressDto address;

}

AddressDto

@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]

注意这一行:&#34; ...预期的参数是:java.lang.String,java.lang.String,com.example.projections.model。 AddressEntity ...& #34;

显然,它期望模型对象 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 个答案:

答案 0 :(得分:3)

来自Spring Data JPA - Reference Documentation

  

定义投影的另一种方法是使用值类型DTO,它包含应该检索的字段的属性。这些DTO类型的使用方式与投影界面的使用方式完全相同,不同之处在于此处不进行任何代理,并且可以应用无嵌套投影。

我认为原因是这个......

答案 1 :(得分:-1)

您正在使用@AllArgsConstructor注释。

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

所以没有no-arg构造函数。

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

List<PersonDto> findAllDtoedBy();

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