node to traverse cannot be null!

本文分析了一个关于Hibernate HQL查询出现的语法错误,并详细解释了如何从异常堆栈中定位问题所在,最终发现是因为拼写错误导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

line 1:1: unexpected token: form
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:169)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:197)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1736)
at test.Test.main(Test.java:24)


Exception in thread "main" java.lang.IllegalArgumentException: node to traverse cannot be null!
at org.hibernate.hql.internal.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:63)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:272)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:197)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1736)

at test.Test.main(Test.java:24)

package test;

import java.util.*;
import org.hibernate.*;
import org.util.*;
import org.model.Kcb;
import org.util.HibernateSessionFactory;

public class Test {
	public static void main(String args[]){
		//调用HibernateSessionFactory的getSession()方法穿件Session对象
		Session session=HibernateSessionFactory.getSession();
		//创建事务对象
		Transaction ts=session.beginTransaction();
		//创建POJO类对象
		Kcb kcb=new Kcb();
		kcb.setKch("12");
		kcb.setKcm("java");
		kcb.setKxxq(new Short((short)5));
		kcb.setXf(1);
		kcb.setXs(2);
		session.save(kcb);
		ts.commit();
		Query query=session.createQuery("form Kcb where kch=198");
		List list=query.list();
		Kcb kc=(Kcb) list.get(0);
		HibernateSessionFactory.closeSession();
	}
}

原因:from写成了form

<template> <div> <div id="container" style="width:100%; height: 600px;"></div> <!-- 添加节点的对话框 --> <el-dialog v-model="dialogVisible" title="添加新节点" width="30%"> <el-input v-model="newNodeName" placeholder="请输入节点名称" /> <div style="margin-top: 20px;"> <span style="margin-right: 10px;">选择类型:</span> <el-select v-model="proxyType"> <el-option label="Proxy" value="proxy" /> <el-option label="Global" value="global" /> </el-select> </div> <template #footer> <el-button @click="dialogVisible = false">取消</el-button> <el-button type="primary" @click="addChildNode">确认</el-button> </template> </el-dialog> </div> </template> <script setup> import { ref, onMounted } from 'vue'; import { Graph,treeToGraphData,register,ExtensionCategory } from '@antv/g6'; import {TREELIST} from './data' import networkimg from "@/assets/img/network.png" const graph = ref(null); const rawData = ref(TREELIST) let dialogVisible =ref(false) 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: { type: 'image', style: (d) => { const style = { src: networkimg, 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: 'click', // 'click' or 'contextmenu' onClick: (value, target, current) => { // alert('You have clicked the「' + value + '」item'); if(value == 'add'){ dialogVisible.value=true // 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() } } const getNodeImage = (d) => { // 根据节点类型返回不同的图片URL // 你可以根据实际情况调整这里的逻辑 if (d.type === 'web') return 'https://gw.alipayobjects.com/zos/basement_pr我要第二层节点换成别的图片
最新发布
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值