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的功能强大,可以先写好实体类,运行完再去对数据库字段做一些修改,对程序员开发​,业务转换,对象建模​能力要求高,目前仍在学习中。

 

posted @ 2022-12-28 18:01  Sjh_code  阅读(130)  评论(0编辑  收藏  举报