Quantcast
Channel: Mis Chorradas
Viewing all articles
Browse latest Browse all 84

Spring Data JPA, a un paso de Ruby On Rails

$
0
0

Estaba leyendo la referencia de Spring Data JPA y me he quedado asombrado. ¡Te da todo prácticamente hecho para el DAO!

Simplemente creas una intefaz que extienda de JpaRepository, por ejemplo:

public interface UserRepository extends JpaRepository<User, Integer> {
    List<User> findByName(String name) ;
    User findByEmail(String email) ;
}

Después lo inyectas (no se puede inyectar una interfaz, sino que Spring crea en tiempo de ejecución una clase que cumple dicha interfaz) donde quieras:

@Repository("userDao")
@Transactional
public class JpaUserDao implements UserDao {

    @Autowired
    private UserRepository userRepository ;
    
    @Transactional(readOnly=true)
    @Override
    public List<User> findAll() {
        return Lists.newArrayList(this.userRepository.findAll()) ;
    }
    ...
}

(La clase Lists pertenece a guava)

¡Y ya está! ¡No hay que implementar nada más!

OMG, YESPero eso no es todo. Spring no sólo implementa todos los métodos de JpaRepository siguientes:

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
	List<T> findAll();
	List<T> findAll(Sort sort);
	List<T> findAll(Iterable<ID> ids);
	<S extends T> List<S> save(Iterable<S> entities);
	void flush();
	<S extends T> S saveAndFlush(S entity);
	void deleteInBatch(Iterable<T> entities);
	void deleteAllInBatch();
	T getOne(ID id);
}

sino que, además, implementa automáticamente los métodos que poseen un nombre según unas reglas, como por ejemplo en UserRepository:

public interface UserRepository extends JpaRepository<User, Integer> {
    List<User> findByName(String name) ;
    List<User> findByEmail(String email) ;
    List<User> findByEmailOrName(String email, String name) ;
    List<User> findByEmailAndName(String email, String name) ;
    Slice<User> findByName(String name, Pageable pageable) ;
    Page<User> queryFirst10ByLastname(String lastname, Pageable pageable) ;
    List<User> findByNameAndLastnameAllIgnoreCase(String name, String lastname) ;
}

La sintaxis aparece en la referencia de Spring Data JPA sobre los keyworks soportados en nombres de métodos.

Casi como en Ruby On Rails :)

OMG O

Bueno… hay que configurar JPA y Spring Data JPA (en la referencia), claro :)


Viewing all articles
Browse latest Browse all 84

Trending Articles