再解“node to traverse cannot be null!”

HQL语句常见错误

 java hibernate 中"node to traverse cannot be null"的错误

出现这种问题是因为HQL语句出现问题,引起内部查询对象为空,
无法处理为空值引起的。检查HQL语句是否正确(尤其是关键字)。

我几次检查到 from 并没有写错!但错误就是出在了这里!
无奈上网寻求!但也都是from写错的缘故!
后来我再仔细一看!的确是HQL语句写法错误!请看下面这个对比

1."SELECT COUNT(r) FROM Reply r where r.topic=?") 
2."SELECT COUNT(r) FROM Reply r where r.topic=?") 

注意:第一条语句中select 和count(r)之间的空格
1.是全角输入状态下的空格
2.是半角输入状态下的空格
还是好好巩固下基础!再仔细些了!不要多按了键! 
 

<template> <div> <!-- <button @click="addChildNode">添加子节点</button> --> <div id="container" style="width:100%; height: 600px;"></div> </div> </template> <script setup> import { ref, onMounted } from 'vue'; import { Graph,treeToGraphData } from '@antv/g6'; import {TREELIST} from './data' const graph = ref(null); const rawData = ref(TREELIST) onMounted(() => { const container = document.getElementById('container'); function isLeafNode(d) { return !d.children || d.children.length === 0; } const graph = new Graph({ container: 'container', autoFit: 'view', data: treeToGraphData(rawData.value), behaviors: ['drag-canvas', 'zoom-canvas', 'drag-element', 'collapse-expand'], node: { style: (d) => { const style = { labelText: d.id, labelPlacement: 'right', labelOffsetX: 2, labelBackground: true, ports: [{ placement: 'top' }, { placement: 'bottom' }], }; if (isLeafNode(d)) { Object.assign(style, { labelTransform: [ ['rotate', 90], ['translate', 18], ], labelBaseline: 'center', labelTextAlign: 'left', }); } return style; }, animation: { enter: false, }, }, edge: { type: 'cubic-vertical', animation: { enter: false, }, }, layout: { preventOverlap: true, type: 'compact-box', direction: 'TB', getHeight: function getHeight() { return 16; }, getWidth: function getWidth() { return 16; }, getVGap: function getVGap() { return 80; }, getHGap: function getHGap() { return 20; }, }, plugins: [ { type: 'contextmenu', trigger: 'contextmenu', // 'click' or 'contextmenu' onClick: (value, target, current) => { // alert('You have clicked the「' + value + '」item'); if(value == 'add'){ const parentId = current.id if (parentId) { addChildNode(parentId, graph) } }else{ deleteNode(current.id, graph) } }, getItems: () => { return [ { name: '添加节点', value: 'add' }, { name: '删除', value: 'delete' }, ]; }, }, ], }); graph.render(); }); function addChildNode(parentId, graphInstance) { const newNode = { id: `node-${Date.now()}` } // 需要确保rawData是响应式数据 const currentData = rawData.value // 深拷贝原始数据 const traverse = (node) => { if (node.id === parentId) { if (!node.children) node.children = [] node.children.push(newNode) return true } return node.children?.some(child => traverse(child)) } if (traverse(currentData)) { // 更新图形数据 graphInstance.setData(treeToGraphData(currentData)) // graphInstance.layout() graphInstance.fitView() graphInstance.render() // 确保重新渲染 } } function deleteNode(nodeId, graphInstance) { // 特殊情况处理:不允许删除根节点 if (nodeId === rawData.value.id) { alert('Cannot delete root node!') return } // 深拷贝原始数据以避免直接修改响应式数据 const currentData = rawData.value // 递归查找并删除目标节点 const traverse = (node) => { if (node.children) { const index = node.children.findIndex(child => child.id === nodeId) if (index !== -1) { node.children.splice(index, 1) return true } return node.children.some(child => traverse(child)) } return false } if (traverse(currentData)) { // 更新原始数据 rawData.value = currentData // 更新图形数据 graphInstance.setData(treeToGraphData(currentData)) graphInstance.fitView() graphInstance.render() } } </script> 所有节点换成图片
最新发布
07-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值