每日一得-org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!错误解决办法

本文介绍了Hibernate HQL中JOIN查询的正确用法,包括如何替换ON为WHERE条件、明确对象间映射关系,并通过具体例子展示了如何解决Path expected for join异常。

org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!

HQL进行JOIN连接查询时需要注意几点:

1.HQL不支持ON,需要将ON换成WHERE

2.需要注明对象之间的映射关系


Product.hbm.xml映射文件如下:

<one-to-one name="book" class="com.entity.Book" fetch="join"/>

Product类中需要有

private Book book;

HQL语句:

String hql = "select new com.entity.BookInfo(p.id,p.productName,p.fixedPrice,p.dangPrice,p.addTime," +
     "b.author,b.publishing,b.publishTime,b.catalogue,p.productPic)"+
         "from Product p, Book b where p.id=b.id and b.publishTime=(" +
         "select max(b.publishTime) from Product p join p.book b where p.id=b.id)";

`org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!` 错误通常在 HQLHibernate Query Language)中使用连接(join)操作时出现,该错误表明在连接操作的语法上存在问题。下面是针对给定 HQL 查询语句的具体分析与解决办法: ### 问题分析 1. **实体类名称问题**:在 HQL 里,使用 `join` 时要确保实体类的名称是全限定名或者在 Hibernate 的映射配置里已经定义了别名。`Ezzzcjld` 也许没有使用全限定名,或者没有正确映射。 2. **`on` 子句使用问题**:HQL 里的 `join` 操作一般不使用 `on` 子句,而是使用实体类之间的关联关系。 3. **`orde` 拼写错误**:查询语句末尾的 `orde` 明显是拼写错误,可能是想写 `order by`。 4. **未限定字段名**:`yljgdm` 和 `zzzzxx` 没有指定是哪个表的字段,这可能会让 Hibernate 无法确定字段的来源。 ### 解决办法 #### 1. 使用实体类的关联关系 要是 `GwzzEntity` 和 `Ezzzcjld` 实体类之间存在关联关系,就可以直接使用关联关系进行连接,无需 `on` 子句。 ```java // 假设 GwzzEntity 中有一个关联属性 ezzzcjld String hql = "from com.wondersgroup.zhjg.base.entity.GwzzEntity t1 " + "left outer join t1.ezzzcjld t2 " + "where t1.yljgdm not in ('000001','150627','70') " + "and t1.zzzzxx is null " + "order by ..."; // 补充完整 order by 子句 ``` #### 2. 确保实体类名称正确 如果实体类之间没有关联关系,要确保使用全限定名。 ```java String hql = "from com.wondersgroup.zhjg.base.entity.GwzzEntity t1 " + "left outer join com.wondersgroup.zhjg.base.entity.Ezzzcjld t2 " + "with t1.id = t2.id " + "where t1.yljgdm not in ('000001','150627','70') " + "and t1.zzzzxx is null " + "order by ..."; // 补充完整 order by 子句 ``` ### 完整示例代码 ```java import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import java.util.List; public class HqlQueryExample { public static void main(String[] args) { // 创建 SessionFactory SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); // 打开 Session Session session = sessionFactory.openSession(); // 正确的 HQL 查询语句 String hql = "from com.wondersgroup.zhjg.base.entity.GwzzEntity t1 " + "left outer join t1.ezzzcjld t2 " + "where t1.yljgdm not in ('000001','150627','70') " + "and t1.zzzzxx is null " + "order by t1.id"; // 示例 order by 子句 // 执行查询 List<Object[]> result = session.createQuery(hql, Object[].class).getResultList(); // 处理结果 for (Object[] row : result) { // 处理每一行数据 } // 关闭 Session session.close(); // 关闭 SessionFactory sessionFactory.close(); } } ``` ### 总结 - 保证实体类名称使用全限定名或者正确的别名。 - 运用实体类之间的关联关系进行连接,避免使用 `on` 子句。 - 检查并修正查询语句中的拼写错误- 明确指定每个字段所属的表。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值