Spring Boot Data Jpa常用API

service中执行sql

根据请求参数拼接sql

import javax.persistence.Query;
import javax.persistence.EntityManager;

@Autowired
private EntityManager em;

StringBuffer sql = new StringBuffer();
// 执行sql
Query query = em.createNativeQuery(sql.toString());
// 返回值的集合(每个Object[]代表一行记录的值数组)
List<Object[]> data = query.getResultList();
// 获取对应的属性,顺序要和值的顺序一样(也就是表头)

Repository查询

sql形式的方法名

查询:

例:findAllByParamsKeyAndValue
findAllBy + 实体属性名(首字母大写)+ sql条件拼接关键字(And或Or)+ 实体属性名(首字母大写)
例: findByOrgIdAndApprovalIdOrderByApIdDesc
根据ApId字段降序

存在判断

例:existsById
existsBy + 实体属性名(首字母大写)

自定义sql

例:

import org.springframework.data.jpa.repository.Query;

@Query(
      value =
          "SELECT * FROM table_name WHERE id = ?1",nativeQuery = true)
  EntityName selectOne(Long id);

动态拼接条件查询

例:

import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.CriteriaBuilder;

   * @param orgId id
   * @param startDateFrom 开始时间
   * @param endDateFrom 结束时间
   * @param actName 名称


List<EntityName > all =
        EntityNameRpository.findAll(
            (root, query, cb) -> {
              List<Predicate> predicates = new ArrayList<>(); // and 条件
              // 时间
              if (StringUtils.isNotBlank(startDateFrom)) {
                Date startDate = DateExtUtils.StringToDate(startDateFrom);
                // startDate为实体属性名,下同理
                predicates.add(
                    cb.greaterThanOrEqualTo(root.get("startDate").as(Date.class), startDate));
              }
              if (StringUtils.isNotBlank(endDateFrom)) {
                Date endDate = DateExtUtils.StringToDate(endDateFrom);
                predicates.add(cb.lessThanOrEqualTo(root.get("endDate").as(Date.class), endDate));
              }
              predicates.add(
                  cb.equal(root.get("rowst").as(Long.class), RowStatusEnum.VALID.getCode()));
              // id信息
              predicates.add(cb.equal(root.get("orgId").as(Long.class), finalOrgId));
              // 模糊检索 名称
              if (StringUtils.isNotBlank(actName)) {
                predicates.add(cb.like(root.get("actName").as(String.class), "%" + actName + "%"));
              }
              // 添加in条件
              CriteriaBuilder.In<String> in = cb.in(root.get("approvalId"));
              List<String> list1 = new ArrayList<>();
              list1.add("1");
              list1.add("2");
              list1.add("3");
              for (String approvalId : list1) {
                in.value(approvalId);
              }
              CriteriaBuilder.In<String> in1 = cb.in(root.get("approvalId"));
              list1.clear();
              list1.add("4");
              list1.add("10");
              for (String approvalId : list1) {
                in1.value(approvalId);
              }
              predicates.add(
                  cb.or(cb.and(in, cb.equal(root.get("approvalState"), accUser.getId())), in1));

              return query
                  .orderBy(cb.desc(root.get("apId")))
                  .where(cb.and(predicates.toArray(new Predicate[0])))
                  .getRestriction();
            });

以上均为个人理解,有待完善......

posted @ 2022-04-03 14:15  喵师傅  阅读(148)  评论(0编辑  收藏  举报