Spring Data Repositories使用

本文详细介绍了Spring Data JPA中的Repository接口,包括CrudRepository、PagingAndSortingRepository及JpaRepository的功能与使用方法,并展示了如何自定义Repository接口以满足特定需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • CrudRepository接口使用

对实体的增删改查CRUD操作API, CrudRepository接口源码:

@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标签。

@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这个接口。

举例:

public interface UserRepository extends CrudRepository<User, Long> {

  Long deleteByLastname(String lastname);

  List<User> removeByLastname(String lastname);

}

 

  • JpaRepository接口使用

先看源码,JpaRepository接口拥有PagingAndSortingRepository、CrudRepository接口功能。

@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类

考虑到有些开发不需要使用多余的操作,可自定义接口,如下:

情况1:

@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");
    }

 

 

转载于:https://my.oschina.net/guoshuyun/blog/726918

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值