Difference between findBy and findOneBy in Spring data JPA

34,130

Solution 1

Can I use findBy this way? Department findByDepartmentId(Long Id);

Yes, this syntax is technically correct from Spring JPA point of view. Although Spring JPA infers what you're trying to achieve with your query looking at the return type as well.

Basically these are the cases for return types:

That being said, your query definition:

Department findByDepartmentId(Long Id);

means that you expect a single result (because you've specified Entity T as a return type). This will reflect on how Spring JPA executes the query - it will call getSingleResult() on the javax.persistence.Query interface, which will throw an exception if more than one objects satisfy the criteria.

On what basis does findBydepartmentId return a single record?

On the basis that there's a single object with that Id, otherwise it will throw an exception.

When or Why should i not use findBy in place of findOneBy?

Those two have different meanings and are not interchangeable.

findOneBy always results in getSingleResult() being invoked.

findBy has different behavior depending on the return type - as per the definitions given above.

Solution 2

findOneByXX will ensure that there is only one or no value, if there are 2 values an exception will be thrown.

However findByXX doesn't make this check of uniqueness.

Solution 3

I have done some tests and Spring Data ignore all characters between the method (find, delete,...) and By.

In https://github.com/spring-projects/spring-data-commons/blob/14d5747f68737bb44441dc511cf16393d9d85dc8/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L65 it is the \p{Lu}.*? part.

Spring Data only use return type to decide how handle responses.

So it is possible to define these following methods even if it is not correct semantically.

Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);
Share:
34,130
Arun Gowda
Author by

Arun Gowda

JAVA | SPRING BOOT | WEB APPS

Updated on May 01, 2020

Comments

  • Arun Gowda
    Arun Gowda about 4 years

    All i know so far is that FindBy can return multiple results while FindOneBy will return a single result or null when we use it the following way.

    List<Department> findByDepartmentName(String name);
    Department findOneByDepartmentId(Long Id);
    

    now, my question is, can i use findBy this way?

    Department  findByDepartmentId(Long Id);
    

    If yes,

    • Lets assume there are multiple records for given Id.
    • On what basis does findBydepartmentId return a single record?

    Finally, When or Why should i not use findBy in place of findOneBy?