私は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.
私はこれが何とか可能だと思った。どうやって?