我们想在接口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文档中的示例,我们没有看到这种情况的示例,但我们也没有看到明确声明此不支持
答案 0 :(得分:3)
来自Spring Data JPA - Reference Documentation:
定义投影的另一种方法是使用值类型DTO,它包含应该检索的字段的属性。这些DTO类型的使用方式与投影界面的使用方式完全相同,不同之处在于此处不进行任何代理,并且可以应用无嵌套投影。
我认为原因是这个......
答案 1 :(得分:-1)
您正在使用@AllArgsConstructor
注释。
@AllArgsConstructor
为您班级中的每个字段生成一个带有1个参数的构造函数。
所以没有no-arg构造函数。
您可以更新您的回购方法:
List<PersonDto> findAllDtoedBy();
包含一些参数或在类中提供无参数构造函数。 (可能使用@NoArgsConstructor
)