[[geode-repositories]]
== Spring Data Repositories
:geode-name: {apache-geode-name}


Using Spring Data Repositories with {geode-name} makes short work of data access operations when using {geode-name}
as your System of Record (SOR) to persist your application's state.

{spring-data-commons-docs-html}/#repositories[Spring Data Repositories] provides a convenient and highly powerful way
to define basic CRUD and simple query data access operations easily just by specifying the contract of those data access
operations in a Java interface.

Spring Boot for {geode-name} _auto-configures_ the Spring Data for {geode-name} {spring-data-geode-docs-html}/#gemfire-repositories[Repository extension]
when either is declared on your application's classpath. You do not need to do anything special to enable it. Simply
start coding your application-specific Repository interfaces and the way you go.

For example:

Define a `Customer` class to model customers and map it to the {geode-name} "Customers" Region using the SDG
{spring-data-geode-javadoc}/org/springframework/data/gemfire/mapping/annotation/Region.html[`@Region`] mapping
annotation:

.`Customer` entity class
[source,java]
----
package example.app.books.model;

@Region("Customers")
class Customer {

    @Id
    private Long id;

    private String name;

}
----

Declare your _Repository_ (a.k.a. {wikipedia-docs}/Data_access_object[Data Access Object (DAO)]) for `Customers`...

.`CustomerRepository` for peristing and accessing `Customers`
[source,java]
----
package example.app.books.repo;

interface CustomerRepository extends CrudRepository<Customer, Long> {

    List<Customer> findByLastNameLikeOrderByLastNameDescFirstNameAsc(String customerLastNameWildcard);

}
----

Then use the `CustomerRepository` in an application service class:

.Inject and use the `CustomerRepository`
[source,java]
----
package example.app;

@SpringBootApplication
@EnableEntityDefinedRegions(basePackageClasses = Customer.class)
class SpringBootApacheGeodeClientCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootApacheGeodeClientCacheApplication.class, args);
    }

    @Bean
    ApplicationRunner runner(CustomerRepository customerRepository) {

        // Matches Williams, Wilson, etc.
        List<Customer> customers =
            customerRepository.findByLastNameLikeOrderByLastNameDescFirstNameAsc("Wil%");

        // process the list of matching customers...
    }
}
----

Again, see Spring Data Commons' {spring-data-commons-docs-html}/#repositories[Repositories abstraction] in general,
and Spring Data for {geode-name}'s {spring-data-geode-docs-html}/#gemfire-repositories[Repositories extension]
in particular, for more details.
