对实体的增删改查CRUD操做API, CrudRepository接口源码:java
@NoRepositoryBean public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); T findOne(ID primaryKey); Iterable<T> findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); // … more functionality omitted. }
举例:框架
public interface UserRepository extends CrudRepository<User, Long> { Long countByLastname(String lastname); }
先看看PagingAndSortingRepository源码,它继承了CrudRepository接口。并使用了@NoRepositoryBean标签。ide
@NoRepositoryBean public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort var1); Page<T> findAll(Pageable var1); }
添加@NoRepositoryBean标签后,Spring Data Jpa在启动时就不会去实例化BaseRepository
这个接口。post
举例:ui
public interface UserRepository extends CrudRepository<User, Long> { Long deleteByLastname(String lastname); List<User> removeByLastname(String lastname); }
先看源码,JpaRepository接口拥有PagingAndSortingRepository、CrudRepository接口功能。this
@NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { List<T> findAll(); List<T> findAll(Sort var1); List<T> findAll(Iterable<ID> var1); <S extends T> List<S> save(Iterable<S> var1); void flush(); <S extends T> S saveAndFlush(S var1); void deleteInBatch(Iterable<T> var1); void deleteAllInBatch(); T getOne(ID var1); }
使用时,直接继承JpaRepository接口,便可调用已有的接口。代理
考虑到有些开发不须要使用多余的操做,可自定义接口,以下:code
状况1:orm
@NoRepositoryBean interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> { T findOne(ID id); T save(T entity); } interface UserRepository extends MyBaseRepository<User, Long> { User findByEmailAddress(EmailAddress emailAddress); }
状况2:继承
@NoRepositoryBean public interface MyRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { void sharedCustomMethod(ID id);//为全部实体添加基础接口 } //自定义Repository基本类定义 public class MyRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> { private final EntityManager entityManager; public MyRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); // Keep the EntityManager around to used from the newly introduced methods. this.entityManager = entityManager; } public void sharedCustomMethod(ID id) { // implementation goes here } } 在Spring配置文件中添加: <repositories base-package="com.acme.repository" repository-base-class="….MyRepositoryImpl" />
若JpaRepository接口、SimpleJpaRepository接口不能知足需求,那么咱们须要扩展某个业务Repository。
若是没有配置后缀,默认会找***RepositoryImpl这个类。经过修改repository-impl-postfix参数来修改。
<jpa:repositories base-package="**.**.jpa.dao"
repository-impl-postfix="Impl"/>
则在框架扫描到 AccountDao 接口时,它将尝试在相同的包目录下查找 AccountDaoImpl.java,若是找到,便将其中的实现方法做为最终生成的代理类中相应方法的实现。*注意AccountDao和AccountDaoImpl的前缀必须相同,若是是AccountRepository,对应的实现类必须是AccountRepositroyImpl。不然会报错!!!如:
//自定义接口 public interface UserInfoCustomDao { public Page<Object[]> searchName(String key); } //组合原生JpaRepository接口、自定义接口。 @Repository public interface UserInfoDao extends JpaRepository<UserInfo,Integer>, UserInfoCustomDao { } //自定义接口实现 public class UserInfoDaoImpl implements UserInfoCustomDao { @PersistenceContext private EntityManager em; @Override public Page<Object[]> searchName(String key) { String hql = "select o.uuid,o.name from UserInfo o where 1=1 and o.uuid=:uuid"; Query q = em.createQuery(hql); q.setParameter("uuid", u.getUuid()); q.setFirstResult(0); q.setMaxResults(1); Page<Object[]> page = new PageImpl<Object[]>(q.getResultList(),new PageRequest(0,1),3); return page; } } 添加配置: <jpa:repositories base-package="com.***.dao" repository-impl-postfix="Impl" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/> 使用时,以下调用: @Resource private UserInfoDao userInfoDao; public Page<Object[]> selectUser() { return userInfoDao.searchName("fdfdf"); }