org.hibernate.hql.ast.HqlToken 异常及hibernate不能删除功能解决

本文介绍了解决在WebLogic环境下部署应用时遇到的org.hibernate.hql.ast.HqlToken异常的方法,通过配置weblogic.xml优先加载WEB-INF下的类,并调整相关依赖解决了包冲突问题。

本地的工程部署到linux环境下,出现org.hibernate.hql.ast.HqlToken 异常,具体原因的是weblogic下的包和工程下的包冲突,百度到处都是,不说了。


解决方法

1、 首先增加weblogic.xml,直接将 weblogic.xml放到和web.xml同目录下就可以了。这样可以优先执行web-inf下的包或者类。可以解决包冲突的解决办法。 

<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>

然后出现 weblogic10出现ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory cannot be cast异常。


2、 从WEB-INF/lib下删除xml-apis-1.*.*  

3、 重启服务,工程启动正常,删除功能正常使用



### Hibernate HQL 中 `No data type for node` 异常解决方法 在 HibernateHQL 查询中,当执行查询时遇到 `No data type for node` 异常,通常表明 Hibernate 无法推断某个表达式的返回类型。该异常尤其可能出现在使用自定义函数、方法调用或投影查询时,例如涉及 `MethodNode` 的 HQL 语句。 此类问题的一个常见原因是 HQL 中调用了未被 Hibernate 识别的方法或函数,导致无法确定该方法的返回类型。HibernateHQL 解析器会构建一个抽象语法树(AST),其中每个节点(如 `MethodNode`)都需要有明确的数据类型信息。如果某个方法未在 Hibernate 的类型系统中注册,则会抛出此异常[^1]。 解决该问题的方法包括: - **为自定义方法注册返回类型** 如果在 HQL 中使用了自定义函数或数据库函数,应确保在 Hibernate 配置中注册该函数的返回类型。例如,在 `hibernate.cfg.xml` 或通过 `MetadataBuilder` 添加函数定义: ```xml <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.use_sql_comments">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.id.generator.type">org.hibernate.id.UUIDGenerator</property> <property name="hibernate.query.substitutions"> my_custom_function=org.hibernate.dialect.function.StandardSQLFunction('my_custom_function', org.hibernate.type.StandardBasicTypes.STRING) </property> </session-factory> </hibernate-configuration> ``` - **在 HQL 查询中显式指定类型** 使用 `cast` 或 `as` 语法显式指定表达式的类型。例如: ```hql SELECT cast(myCustomMethod(e.name) as string) FROM Entity e ``` - **避免在投影查询中使用不支持的方法** 如果在使用 `new` 构造器进行投影查询时遇到此问题,应确保构造器参数的表达式都具有明确的类型信息。例如: ```hql SELECT new com.example.dto.MyDTO(cast(myCustomMethod(e.name) as string)) FROM Entity e ``` - **扩展 HibernateAST 解析器** 如果使用的是复杂自定义方法,可能需要通过扩展 `org.hibernate.hql.ast` 包中的类(如 `MethodNode`)来注册自定义方法的返回类型。这通常适用于高级用例,例如开发自定义方言或函数解析器。 - **检查 HQL 语法与实体映射** 确保 HQL 中引用的属性、方法或函数在实体类或映射文件中正确定义,并且与数据库函数匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值