JPA的基本使用
JPA的基本使用
继承 JpaRepository
@Repository public interface UserRepository extends JpaRepository<User,Long> { User findByUserIdAndDeleted(Long userId, Boolean deleted); List<User> findByTypeNotInAndDeleted(Integer type, Boolean deleted); Boolean existsByUserIdAndDeleted(Long userId,Boolean deleted); TrainingProgramUser findByUserIdAndDeletedAndType(Long userId,Boolean deleted,Integer type); @Transactional Integer deleteByUserIdAndType(Long userId,Integer type); @Transactional Integer deleteByTypeIn(List<Integer> type); }
在上面这个接口中,对于一些简单一点的联表,但JPA没提供的sql也可以这样手写。
@Query(value = "select * from user group by sex",nativeQuery = true) List<User> groupBySex();
nativeQuery 是必须的。
对于kingsum与oyhk基于JPA开发的框架
一些复杂联表sql采用这样写。↓
可以另外写一个接口Repository,与按JAP生成的隔开,且不继承JpaRepository
这里只展示一个分页查询。
public interface UserTableRepository { /** * 联表分页查询 */ PageResult<UserPageDto> pageList(PageResult pageResult, String name, Long roleId); }
实现类
@Override public PageResult<UserPageDto> pageList(PageResult pageResult, String name, Long roleId) { SQLPageDoing<UserPageDto> doing = (sql, fields, params, typeReferenceMaP) -> { sql.append(" SELECT %s "); sql.append(" FROM user A") sql.append(" LEFT JOIN role B ON A.role_id = B. id"); sql.append(" WHERE 1=1 "); sql.append(" and A.role_id=:roleId "); params.put("locale", locale); if (!StringUtils.isEmpty(name)) { sql.append(" and A.name like :name "); params.put("name", "%" + name + "%"); } fields.append(" A.* , B.*"); }; return doing.go(pageResult, UserPageDto.class, objectMapper, jdbcTemplate, log); }
个人感觉mybatis也有向JPA发展的趋势,mybatis-plus的出现使得开发人员可以更加快捷的完成开发,一些简单的sql不用写XML文件,用@Query比较快速,JPA的功能强大,可以先写好实体类,运行完再去对数据库字段做一些修改,对程序员开发,业务转换,对象建模能力要求高,目前仍在学习中。