最后还是用了Mybatis,感觉更加灵活些

初步入门

可以参考:程序猿DD的这篇文章
Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

利用自动生成jpa实体类

http://blog.csdn.net/liu_yulo...
https://stackoverflow.com/que...

entity代码中的字段与数据库物理字段保持一致

字段命名默认策略:

org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

entity中userAge,spring在访问的时候会变成user_age
要做到与数据库字段命名一致,需要加上以下配置

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

repository 中 获取某一行,某个字段的值

@Query(value = "select title FROM rule WHERE appId=?1 AND level=?2", nativeQuery = true)
String getTitleByAppIdAndLevel(int appId, int level);

动态多条件分页查询

首先,Repository需要集成JpaSpecificationExecutor<T>,例子:

public interface OrderRepo extends JpaRepository<OrderEntity, Integer>,JpaSpecificationExecutor<OrderEntity> {
}

Service中查询实例,这里要强调一个事情pageNo是从0开始的

public Kv pageForUser(int userId,int pageNo,int pageSize,Byte status){

        PageRequest pageable = new PageRequest(pageNo-1, pageSize);

        //通常使用 Specification 的匿名内部类
        Specification<OrderEntity> specification = new Specification<OrderEntity>() {
            /**
             * @param root: 代表查询的实体类.
             * @param criteriaQuery: 可以从中可到 Root 对象, 即告知 JPA Criteria 查询要查询哪一个实体类. 还可以
             * 来添加查询条件, 还可以结合 EntityManager 对象得到最终查询的 TypedQuery 对象.
             * @param criteriaBuilder  CriteriaBuilder 对象. 用于创建 Criteria 相关对象的工厂. 当然可以从中获取到 Predicate 对象
             * @return Predicate 类型, 代表一个查询条件.
             */
            @Override
            public Predicate toPredicate(Root<OrderEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates = new ArrayList<>();
                Path<Integer> userIdPath = root.get("userId");
                predicates.add(criteriaBuilder.equal(userIdPath,userId));
                if (status != null) {
                    Path<Byte> statusPath = root.get("status");
                    predicates.add(criteriaBuilder.equal(statusPath,status));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        Page<OrderEntity> page = orderRepo.findAll(specification,pageable);
        List<OrderEntity> list = orderRepo.findAll(specification);
        Kv pageData = new Kv();
        //总记录数
        pageData.set("total",page.getTotalElements());
        //总页数
        pageData.set("pageCount",page.getTotalPages());
        //当前第几页
        pageData.set("pageNo",page.getNumber()+1);
        //每页记录数
        pageData.set("pageSize",page.getSize());
        //当前页面的List
        pageData.set("pageList",page.getContent());
        //当前页面的List
        pageData.set("pageRowCount",page.getNumberOfElements());
        return pageData;
    }

MichaelZ
374 声望13 粉丝

web全栈工程师