树与JPA

一、递归构建树状数据

数据库实体:

package com.fengwuJ.entity;


import org.apache.ibatis.annotations.Case;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "api_group")
public class ApiGroup implements Serializable {
    private static final long serialVersionUID = 7403659616901626245L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "group_id")
    private Long groupId;

    @Column(name = "group_name")
    private String groupName;

    @Column(name = "parent_id")
    private Integer parentId;
}

Node节点:

package com.fengwuJ.util;

import com.fengwuJ.entity.Api;
import com.fengwuJ.entity.ApiGroup;

import javax.persistence.Transient;
import java.io.Serializable;
import java.util.List;

public class Group extends ApiGroup implements Serializable {
    private static final long serialVersionUID = -3389102635585382787L;

    private List<Api> apis;  //该节点的apis信息

    private List<Group> groups;    //子节点对象信息
}

树构建类:

package com.fengwuJ.util;

import com.fengwuJ.dao.ApiDao;
import com.fengwuJ.dao.GroupDao;
import com.fengwuJ.entity.ApiGroup;

import java.util.ArrayList;
import java.util.List;

public class TreeTwo {
    //查询group的dao
    private GroupDao groupDao;
    //根节点id
    private Integer root;
    //查询api的dao
    private ApiDao apiDao;

    public TreeTwo(GroupDao groupDao,Integer root,ApiDao apiDao) {
        this.groupDao = groupDao;
        this.root = root;
        this.apiDao = apiDao;
    }

    //建立树形结构
    public List<Group> builTree() {
        List<Group> treeGroups = new ArrayList<>();
        for (Group group : getRootGroup(root)) {
            group = buildChilTree(group);
            treeGroups.add(group);
        }
        return treeGroups;
    }

    //递归,建立子树形结构
    private Group buildChilTree(Group pGroup) {
        List<Group> childGroups = new ArrayList<>();
        List<Group> groupList = groups2Groups(groupDao.findByParentId(pGroup.getGroupId().intValue()));
        if (groupList != null && groupList.size()>0){
            for (Group Group : groupList) {
                childGroups.add(buildChilTree(Group));
            }
        }

        pGroup.setGroups(childGroups);
        return pGroup;
    }

    //获取根节点
    private List<Group> getRootGroup(Integer root) {

        List<ApiGroup> list= groupDao.findByParentId(root);
        List<Group> rootGroupList = groups2Groups(list);
        if (rootGroupList == null || rootGroupList.size() <= 0){
            //没有该根节点是叶子节点
        }
        return rootGroupList;
    }

    //数据转节点结构
    private List<Group> groups2Groups(List<ApiGroup> list) {
        List<Group> groups = new ArrayList<>();
        for (int i = 0; i < list.size(); i++){
            Group group = new Group();

            group.setGroupId(list.get(i).getGroupId());
            group.setGroupName(list.get(i).getGroupName());
            group.setApis(apiDao.findByGroupId(list.get(i).getGroupId().intValue()));
            groups.add(group);
        }
        return groups;
    }
}

二、Jpa使用

1.Jpa派生方法:通过jpa关键字自动实现sql操作,对数据库记录进行更新删除新增的派生方法需要添加@Transactional注解

2.出现该方法未被实作问题:springboot配置文件加上配置:

    logging:

        level:

            org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl:ERROR

3.动态条件分页查询:

    Sort.Derection sort = Sort.Derection.ASC;

    Pageable pageable = PageRequest.of(pageNum,pageSize,sort,orderField);

    Specification<T> specification = (Specification<T>) (root,criteriaQuery,criteriaBuilder) -> {

        List<Predicate> predicates = new ArrayList<>();

        if(dto.getName() != null){

            Predicate p = criteriaBuilder.like(root.getName("name").as(String.class),"%" + dto.getName() + "%");

            predicates.add(p);

        }

       //其他动态条件.....

      //最后

      //转数组传入

      return criteriaBuilder.and(predicates.toArray(new Predicate[0]));

    };

    //tDao需实现JpaSpecificationExecutor<T>

    Page<T> page = tDao.findAll(specification,pageable);

    //page.getNumber(),当前页;page.getSize(),页面大小;page.getTotalElements(),总记录数,page.getContent(),数据

4.关于Jpa事务问题

  1)Jpa自带的每一个更新、删除、插入方法都默认添加了@Transactional注解,没有写入rollBackFor属性

  2)Jpa操作过程中遇到问题会抛出EmptyResultDataAccessException异常,该异常是RunTimeException的子异常

  3)如果rollBackFor没有指定,会默认捕获RunTimeException异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值