20872


リポジトリクラスで、特定フィールドのみをselectしたメソッドの戻り値を、  
Object[]ではなくエンティティーに自動でキャストしてもらう方法はないのでしょうか？

ドキュメントにもそれらしきものがなかったので、ご存じの方がいらっしゃいましたらご教授願います。  
<http://docs.spring.io/spring-data/data-
jpa/docs/current/reference/html/#core.repository-populators>

EntityRepository.java

[code]

    @Repository
    public interface Entity extends JpaRepository<Entity, Long> {
        // 実際の戻り値はList<Object[]>になるが、エラーにはならない
        @Query("select e.id, e.data from Entity e where e.name = ?1")
        List<Entity> findByName(String name);
    }
    
[/code]

Entity.java

[code]

    @Entity  
    @Table(
        name = "entity"
    )
    public class Entity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="id", nullable=false)
        private long id;
        @Column(name="name", nullable=false)
        private String name;
        @Column(name="data", nullable=false)
        private String data;
    
        ... getter setter...
    }
    
[/code]


CC BY-SA 3.0
2016-01-09T15:40:43.563
20789
2016-01-13T03:45:38.287
2016-01-10T23:47:40.593
5778
8396
question
java spring
Spring4で、特定フィールドのみをselectした結果をエンティティーにキャストする方法


JPAでクエリの結果をエンティティオブジェクトに入れる方法はいくつかありますが、  
Spring
DataでJPAを使う場合となると、「コンストラクタを作り、クエリ（JPQL）で呼び出す」という方法しかなさそうです（独自実装コードを書かないという前提）。

[code]

    public class Entity {
      public Entity(long id, String data) {
        this.id = id;
        this.data = data;
      }
      // 以下質問にあるコードと同じ
    }
    
    @Repository
    public interface Repository extends JpaRepository<Entity, Long> {
    
      @Query("select new package.Entity(e.id, e.data) from Entity e where e.name = ?1")
      List<Entity> findByName(String name);
    }
    
[/code]

英語版stackoverflowにも同様の質問と回答がありました。  
jpa - Is there a way to transform objects that spring data repositories
return? - Stack Overflow  
<https://stackoverflow.com/questions/22360744/is-there-a-way-to-transform-
objects-that-spring-data-repositories-return>


CC BY-SA 3.0
2016-01-13T03:45:38.287
20872
2016-01-13T03:45:38.287
2017-05-23T12:38:56.467
-1
4464
20789
answer