Step 1 - Basic Spring configuration and bootstrapping test.

Setting up Spring 3.2.2.RELEASE, Spring Data JPA 1.3.0.RELEASE on Hibernate 4.1.10.Final.
Step 2 - Enable Spring Data JPA repositories.

Add CustomerRepository, add query and save(…) methods as well as test cases executing them.
Step 3 - Move to CrudRepository.

Switch to CrudRepository as base interface and add appropriate test cases.
Step 4 - Moving on to PagingAndSortingRepository.

Moved to PagingAndSortingRepository and added according integration tests.
Step 5 - Redeclaring existing CRUD methods.

Overriding findAll() to show JpaRepository actually returns a List. Overriding save(…) to customize transaction configuration.
Step 6 - Introducing a read-only repository base interface.

Introduced ReadOnlyRepository to capture all read-only repository methods
of CrudRepository and PagingAndSortingRepository. It also fixes the the
type of the ID property to Long. Added Product domain class, sample data
as well as an extension of ReadOnlyRepository to declare a query method
to find Product instances containing a given description.
Step 7 - Adding a manually declared query method.

Introduced a method to lookup products by key and value using the @Query annotation.
Step 8 - Flexible predicate execution.

Added Querydsl as dependency as well as the appropriate setup of the APT processor and IDE integration. Let CustomerRepository extend QuerydslPredicateExecutor and use the API in the integration test to find customers.
Step 9 - Adding custom implementation method.