2017-09-24 12 views
2

私たちは、このように我々はDTOオブジェクトを次のように作成、インタフェース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] 

注ライン:」...期待される引数は次のとおりです。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ドキュメントのサンプルを見ると、このケースの例はありませんでしたがこのではないという明示的な声明は表示されませんサポートされている

答えて

1

Spring Data JPA - Reference Documentationから(probably @NoArgsConstructorをusingによって):

retrievedことするsupposedれるfieldsためpropertiesをhold valueのtypeのDTOsをusingれるprojectionsをdefiningのAnother way。これらのDTOタイプはプロジェクションインターフェイスが使用されているのとまったく同じように使用できますが、ここではプロキシが行われておらず、のネストされた投影は適用できません。私は理由がこれだと思う

...

+0

えっ、どういうわけか私たちは、その部分を逃しました。 – pegasus

0

@AllArgsConstructor注釈を使用しています。

@AllArgsConstructorは、クラスの各フィールドに1つのパラメータを持つコンストラクタを生成します。

したがって、引数なしのコンストラクタは存在しません。

List<PersonDto> findAllDtoedBy(); 

は、いくつかのパラメータが含まれているか、あなたのクラスで引数なしのコンストラクタを提供する:

あなたのレポ方法を更新することができます。