1

I want to figure out how to use @NamedQuery in Spring Data Jpa. As i understand, in plain JPA, @NamedQuery can be used for code organization: query is defined once and can be used anywhere as constant.

I created an example to demonstrate problem. The query i used is very simple and normally can be expressed by repository method name. But it is just for example.

@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;
    }
}

Now i want to use @NamedQuery in my SpringDataJPA-Repository:

public interface PersonRepository extends JpaRepository<Person, Long> {

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

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

}

However, i get this error:

PropertyReferenceException: No property exampleNamedQueryWithOne found for type Person!

The documentation says that repository method that uses @NamedQuery must have name exactly as EntityName.XXX part in named query definition. I want to use the same @NamedQuery twice for two methods that returns same data but differently projected. According to this answer: 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.

I thought that this is somehow possible. How?

1 Answer 1

3

put a @Query annotation on query methods with name of your named query. like shown below.

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

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

and in this case , your named query doesn't need to contain Entity's name.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.