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