JPA - 在递归查询中允许null父级

时间:2018-05-18 06:51:04

标签: spring-data-jpa

我想使用JPA创建组织结构。如果我使用我的控制器插入数据,它将抛出PSQLException,因为第一个节点的父节点为空。但是如果我手动将第一个节点输入到DB中,它适用于下一个节点。我阅读了this和其他帖子,但对我来说没有运气。

这是我的实体:

@RestController
@RequestMapping("/node")
public class NodeController {
@Autowired
private NodeRepository nodeRepository;

@GetMapping
public @ResponseBody Iterable<Node> index(){
    return nodeRepository.findByParentIsNull();
}

@PostMapping
public String add(
        @RequestBody List<Node> nodes){

        nodes.stream().forEach(
                node -> {
                    node.addNode(node);
                }
        );

        nodeRepository.saveAll(nodes);
        return "nice";
     }
}

这是我的控制者:

[
 {
   "id":8,
   "name":"Top Parent",
   "parent":{}
 },{
   "id":9,
   "name":"Node 1",
   "parent":{
      "id":8
    }
 },{
   "id":10,
   "name":"Node 2",
   "parent":{
      "id":8
    }
 },{
   "id":11,
   "name":"Node 3",
   "parent":{
      "id":9
    }
 }
]

而且,这是我的数据样本:

id    |name       |parent_id
===========================
8     |Top Parent |null
9     |Node 1     |8
10    |Node 2     |8
11    |Node 3     |9

通过控制器插入后的预期结果是:

defaultOptions = {} // your default options here

function resetOptions(chart) {
    chart.options = defaultOptions;
    chart.update();
}

如果不清楚,请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。所以,如果有人遇到与我类似的问题,我就放在这里。 我在我的存储库中添加了一个NativeQuery,如下所示:

exports.UserDiseaseInfo = (req, res, next) => {
  let retval = {};
  let dId = "";
  let subDName = "";
  let body = req.body;
  let UId = (body.UId != undefined) ? body.UId : false;
  let SubDId = (body.SubDId != undefined) ? body.SubDId : false;
  if (UId == false || SubDId == false) {
    res.status(404).send({
      response: "Fail",
      body: req.body
    })
  }
  subDisease_model.findById(SubDId, function(error, doc) {
    if (error) {
      let data = {
        response: 'false',
        subDisease: "",
        DiseaseId: ""
      }
      return res.status(404).send(data);
    } else {
      dId = doc['DiseaseID'];
      subDName = doc['SubDisease'];
      let data = {
        response: 'success',
        subDisease: subDName,
        DiseaseId: dId
      }
      return res.status(200).send(data);
    }
  })
}

然后我在控制器中添加了一些这样的行:

@Query(value = "insert into tree values(:id,:name)", nativeQuery = true)
void saveTop(@Param("id")int id,@Param("name")String name);

基本上,我创建了一个端点(&#34; / node / top&#34;)来手动插入我的结构组织树的顶层节点。