3. Repository

Example 1. PersonRepository

The repository extends JpaRepository and passes the JPA entity and it's primary key being managed. Basic methods for finding a single record, all records, paginated records, create/update, and delete are automatically provided. It's also very easy to overload any custom query to add pagination and sorting.

The findByFirstNameLike method let's Spring Data JPA automatically generate a like query for the first name column, and findByLastName for an equals query for the last name column. The third method, findByAddress, creates a custom query using @Query and a standard JQL query. @Param is used before the method param to create a named parameter. Otherwise it would have created a position based param (ex: 'a.address = ?0').

[Note]Note

Refer to Spring Data JPA's query creation section to see all the different ways the method name can be overloaded to automatically generate queries (And/Or/Between/LessThan/GreaterThan/etc.).

                
public interface PersonRepository extends JpaRepository<Person, Integer> {
    
    public final static String FIND_BY_ADDRESS_QUERY = "SELECT p " + 
                                                       "FROM Person p LEFT JOIN p.addresses a " +
                                                       "WHERE a.address = :address";

    /**
     * Find persons like first name.
     */
    public List<Person> findByFirstNameLike(String firstName);

    /**
     * Find persons by last name.
     */
    public List<Person> findByLastName(String lastName);

    /**
     * Find persons by address.
     */
    @Query(FIND_BY_ADDRESS_QUERY)
    public List<Person> findByAddress(@Param("address") String address);

    ...
    
}

                
            

Example 2. PersonRepository Page Query

The second findByAddress query performs the same search as the first one, but a Pageable parameter has been added to the method. The page, and number of records for a page can be passed in.

[Note]Note

Besides being able to add Pageable, there is also a Sort parameter that can be added. A PageRequest, which implements Pageable, can also take sort information. So only a Pageable or Sort needs to be added to a repository method.

                
public interface PersonRepository extends JpaRepository<Person, Integer> {

    ...
    
    /**
     * Find paged persons by address.
     */
    @Query(FIND_BY_ADDRESS_QUERY)
    public Page<Person> findByAddress(@Param("address") String address, Pageable page);

    ...
        
}
                
            

Example 3. PersonRepository Named Query

The final query, findByName, searches for first and last name using a custom query. But instead of embedding the query in Java it is named query in the orm.xml. This may make it easier to manage larger queries.

[Note]Note

The query is automatically matched to '${domainClassName}.${methodName}', but this can be overridden using the @Query name attribute.

                
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" 
                 version="2.0">

    <named-query name="Person.findByName">
        <query>select p from Person p where p.firstName = :firstName AND p.lastName = :lastName</query>
    </named-query>

</entity-mappings>
                
            
                
public interface PersonRepository extends JpaRepository<Person, Integer> {

    ...
    
    /**
     * Find persons by first and last name.
     */
    public List<Person> findByName(@Param("firstName") String firstName, @Param("lastName") String lastName);
    
}