org.hibernate.QueryException: ClassNotFoundExcepti

本文介绍了一种在使用Hibernate框架进行HQL查询时遇到的ClassNotFoundException异常及其解决方案。通过在配置文件hibernate.cfg.xml中添加特定属性设置,可以解决因HQL解析问题导致的异常。

今天在做hibernate查询时出现如下异常:

org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from com.easymap.inter.model.ToaRecvdoc t where t.recvdocCode=?] 
    org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:80)
    antlr.CharScanner.setTokenObjectClass(CharScanner.java:340)
    org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:54)
    antlr.CharScanner.(CharScanner.java:51)
    antlr.CharScanner.(CharScanner.java:60)
    org.hibernate.hql.antlr.HqlBaseLexer.(HqlBaseLexer.java:56)
    org.hibernate.hql.antlr.HqlBaseLexer.(HqlBaseLexer.java:53)
    org.hibernate.hql.antlr.HqlBaseLexer.(HqlBaseLexer.java:50)
    org.hibernate.hql.ast.HqlLexer.(HqlLexer.java:49)

...................

 

解决之法是:

在hibernate.cfg.xml  这个文件中加入如下一句:

<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>

 

 

Hibernate 查询中,当你使用 HQL(Hibernate Query Language)进行查询并尝试添加 `ORDER BY` 子句时,可能会遇到如下错误: ``` net.sf.hibernate.QueryException: path expression ends in a composite value ``` 这个异常通常是因为你在 `ORDER BY` 子句中引用了一个复合属性(即关联对象本身),而不是该对象的某个具体字段。 --- ### ✅ 示例场景 假设你有两个实体类:`User` 和 `Address`,其中 `User` 有一个指向 `Address` 的关联: ```java public class User { private Long id; private String name; private Address address; // 关联对象,是一个复合值类型 // getters and setters } public class Address { private String city; private String street; // getters and setters } ``` 你可能写了如下的 HQL 查询: ```java String hql = "FROM User u ORDER BY u.address"; Query query = session.createQuery(hql); ``` 这就会抛出: ``` net.sf.hibernate.QueryException: path expression ends in a composite value ``` --- ### ❌ 原因分析 HQL 不允许对一个复合值(composite value)进行排序。也就是说,你不能直接用 `u.address` 来排序,因为 `address` 是一个对象,不是一个标量值(例如字符串、数字等)。 --- ### ✅ 正确做法 你应该指定要根据复合对象中的某个字段进行排序,比如按地址的 `city` 或 `street` 排序: ```java String hql = "FROM User u ORDER BY u.address.city"; Query query = session.createQuery(hql); ``` 或者多个字段: ```java String hql = "FROM User u ORDER BY u.address.city ASC, u.address.street DESC"; Query query = session.createQuery(hql); ``` --- ### ✅ 其他解决方案(适用于投影查询) 如果你只是想显示某些字段并排序,可以使用投影(select 子句)来避免这个问题: ```java String hql = "SELECT u.name, u.address.city FROM User u ORDER BY u.address.city"; List<Object[]> results = session.createQuery(hql).list(); ``` --- ### 🧪 衍生问题排查建议 - 如果你不确定哪个属性是复合值,可以通过日志或调试查看 HQL 解析过程。 - 使用 IDE 插件(如 IntelliJ IDEA 的 HQL 支持)可以帮助提前识别这类语法错误。 - 确保所有用于排序的字段都是基本数据类型或可映射的简单属性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值