2017-04-20 2 views
0

私はSpringデータJpaで@NamedQueryを使用する方法を理解したいと思います。私が理解しているように、普通のJPAでは@NamedQueryをコード編成に使用することができます。クエリーは一度定義され、定数としてどこでも使用できます。SpringデータJPAの複数のクエリメソッドで名前付きクエリを再利用するには?

問題を示す例を作成しました。私が使用したクエリは非常に簡単で、通常はリポジトリメソッド名で表現できます。しかしそれは単なる例です。

@Entity 
@NamedQueries({ 
    @NamedQuery(name = EXAMPLE_NAMED_QUERY, 
       query = "SELECT person FROM Person person WHERE person.id = :personId") 
}) 
public class Person { 

    public static final String EXAMPLE_NAMED_QUERY = "Person.exampleNamedQuery"; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String name; 

    private String propertyOne; 

    private String propertyTwo; 

    protected Person() {} 

    public Person(String name, String propertyOne, String propertyTwo) { 
     this.name = name; 
     this.propertyOne = propertyOne; 
     this.propertyTwo = propertyTwo; 
    } 

    public Long getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getPropertyOne() { 
     return propertyOne; 
    } 

    public void setPropertyOne(String propertyOne) { 
     this.propertyOne = propertyOne; 
    } 

    public String getPropertyTwo() { 
     return propertyTwo; 
    } 

    public void setPropertyTwo(String propertyTwo) { 
     this.propertyTwo = propertyTwo; 
    } 
} 

は、今私は私のSpringDataJPA・リポジトリに@NamedQueryを使用したい:

public interface PersonRepository extends JpaRepository<Person, Long> { 

    List<PersonProjectionOne> exampleNamedQueryProjectedByOne(@Param("personId") Long personId); 

    List<PersonProjectionTwo> exampleNamedQueryProjectedByTwo(@Param("personId") Long personId); 

} 

しかし、私はこのエラーを取得:

PropertyReferenceException: No property exampleNamedQueryWithOne found for type Person!

ドキュメントは、リポジトリメソッドが使用することを言います@NamedQueryは、名前付きクエリ定義でEntityName.XXXと同じ名前を持つ必要があります。同じデータを返すが、投影方法が異なる2つのメソッドに対して、同じ@NamedQueryを2回使用したい。この回答によると:https://stackoverflow.com/a/25057982/5728559

However, if you want to re-use the query definition on multiple query methods, using a named query is still a reasonable option.

私はこれが何とか可能だと思った。どうやって?

答えて

1

名前付きクエリの名前を持つクエリメソッドに@Queryアノテーションを追加します。 のようになります。

@Query(name = "yourNamedQueryName") 
List<PersonProjectionOne> exampleNamedQueryProjectedByOne(@Param("personId") Long personId); 

@Query(name = "yourNamedQueryName") 
List<PersonProjectionTwo> exampleNamedQueryProjectedByTwo(@Param("personId") Long personId); 

この場合、名前付きクエリにはエンティティの名前を含める必要はありません。

関連する問題