spring data jpa

22
Spring Data JPA: Easy Way to Query Database without SQL Audrius Mičiulis

Upload: kaukole

Post on 17-Jul-2015

282 views

Category:

Software


4 download

TRANSCRIPT

Page 1: Spring Data JPA

Spring Data JPA:

Easy Way to Query Database without SQL

Audrius Mičiulis

Page 2: Spring Data JPA

Spring Data

Spring Data JPA

Spring Data Mongo DB

Spring Data Redis

Spring Data Solr

Spring Data Hadoop

Spring Data REST

Spring Data NEO4J

Spring Data Cassandra

etc.

2

Page 3: Spring Data JPA

Spring Data Dependencies

<dependencies>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-entitymanager</artifactId>

<version>4.2.16.Final</version>

</dependency>

<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-jpa</artifactId>

<version>1.7.2.RELEASE</version>

</dependency>

</dependencies>

3

Page 4: Spring Data JPA

Spring Data Configuration

Configure dependencies

Create the properties file

Configure the DataSource bean

Configure the Entity Manager factory bean

Configure the Transaction Manager bean

Enable annotation-driven transaction management

Configure Dependency Injection

Configure Spring Data JPA

Create database

4

Page 5: Spring Data JPA

CrudRepository<T, ID>

T findOne(ID primaryKey);

Iterable<T> findAll();

Long count();

boolean exists(ID primaryKey);

T save(T entity);

void delete(T entity);

5

Page 6: Spring Data JPA

Examples

userRepository.findAll();

userRepository.findOne(id);

userRepository.count();

userRepository.save(user);

userRepository.exists(userId);

6

Page 7: Spring Data JPA

PagingAndSortingRepository<T, ID>

Iterable<T> findAll(Sort sort);

Page<T> findAll(Pageable pageable);

7

Page 8: Spring Data JPA

Examples

taskRepository.findAll(pageable);

8

Page 9: Spring Data JPA

CustomRepository<T, ID>

@NoRepositoryBean

public interface BaseRepository<T, ID extends

Serializable> extends Repository<T, ID> {

T findOne(ID id);

T save(T entity);

}

9

Page 10: Spring Data JPA

Defining query methods

find…By…, count…By…, delete…By…

…Distinct…

…And…, …Or…

…Equals…, (…Is…), …Not…, …In…, …NotIn…,

…Like…, …NotLike…, …StartingWith…,

…EndingWith…, …Containing…

…Between…, …LessThan…, …LessThenEqual…,

…GreaterThan…, …GreaterThanEqual…

…After…, …Before…

…IsNull…, …isNotNull, (…notNull…), True, False

…IgnoreCase…, …AllIgnoreCase…

…OrderBy…Asc, …OrderBy…Desc

10

Page 11: Spring Data JPA

Examples Long countByFirstName(String firstName);

List<User> findByUserTypeOrderByFirstNameDesc(UserType

userType);

User findByFirstNameAndLastName(String firstName, String

lastName);

User findByFirstNameAndLastNameAllIgnoreCase(String firstName,

String lastName);

List<Task>

findByAssignedToUserFirstNameAndAssignedToUserLastName(String

firstName, String lastName);

List<Task>

findByAssignedToUser_FirstNameAndAssignedToUser_LastName(String

firstName, String lastName);

11

Page 12: Spring Data JPA

Limiting the results

…first10…

Pageable

12

Page 13: Spring Data JPA

Examples List<Task> findFirst3ByCreatedByUser(User user, Sort sort);

13

Page 14: Spring Data JPA

Custom queries

@Query, @Param

JPQL (Java Persistence Query Language)

Validation at boot time

14

Page 15: Spring Data JPA

Examples @Query("select t from Task t where t.number IN (:numbers)")

List<Task> findByNumberIn(@Param("numbers") Collection<String>

numbers);

15

Page 16: Spring Data JPA

Named queries

@NamedQuery, @NamedNativeQuery

<named-query name="…">

<query>…</query>

</named-query>

16

Page 17: Spring Data JPA

Examples@Entity

@Table(schema = "core", name = "task")

@NamedQuery(name = "Task.findAssignedTasks", query = "select t

from Task t where t.assignedToUser is not null")

public class Task {

}

17

Page 18: Spring Data JPA

Custom interfaces

Create interface

Create implementation

Extend created interface from repository

18

Page 19: Spring Data JPA

Examplespublic interface CustomTaskRepository {

String findTaskNumberByTitleFragment(String fragment);

}

@Repository

public class TaskRepositoryImpl implements CustomTaskRepository {

@PersistenceContext

private EntityManager entityManager;

@Override

public String findTaskNumberByTitleFragment(String fragment) {

Query query = entityManager.createNativeQuery(…);

query.setParameter("fragment", "%" + fragment + "%");

return (String) query.getSingleResult();

}

}

19

Page 20: Spring Data JPA

Spring Data JPA

Sophisticated support to build repositories based on

Spring and JPA

Pagination support, dynamic query execution, ability

to integrate custom data access code

Validation of @Query annotated queries at bootstrap

time

Support for QueryDSL predicates and thus type-safe

JPA queries

Transparent auditing of domain class

Java based repository configuration by introducing

@EnableJpaRepositories

20

Page 21: Spring Data JPA

Disadvantages

21

Method names are very long on complicated

structures

Native SQL can be more efficient

No support for aggregating queries

Page 22: Spring Data JPA

Questions

22