Spring Data Repositories使用

  • CrudRepository接口使用

对实体的增删改查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使用

先看看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接口使用

先看源码,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接口,便可调用已有的接口。代理

 

  • 自定义基础Repository类

考虑到有些开发不须要使用多余的操做,可自定义接口,以下: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" />

 

  • 扩展Repository接口功能:

若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");
    }
相关文章
相关标签/搜索