一、递归构建树状数据
数据库实体:
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异常

2249

被折叠的 条评论
为什么被折叠?



