关于SSH多表联查sql语句中jion和Path expected for join!的问题!

本文讲述了在SSH框架下进行多表联查SQL语句时遇到的'Path expected for join!'错误,以及在尝试解决问题的过程中遇到的其他挑战。通过分析和尝试,作者发现错误可能是由于HQL不支持特定的JOIN语法、实体类类型转换错误、建立的关系不正确等原因。最终,作者提供了一套解决方案,包括正确设置实体类别名、使用外键连接、校验类型匹配等,证明了自动生成的SQL可以处理复杂的查询语句。

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

       我的查询总共四个表:发票总表IV_Invoice 入库表IV_InInvoice  出库表IV_OutInvoice  交票表IV_Archive,然后对应关系就省略了。。。关系搭建的是没有任何问题的...直接看查询代码

//查询总表IV_InvoiceVo这个类是我查的所有数据封装类
	public List<IV_InvoiceVo> findall() {
			// TODO Auto-generated method stub
		System.out.println("查询总表daoimpl进来了。。。。");
		List<IV_InvoiceVo> list=getSession().createQuery("select new com.ssh.entity.IV_InvoiceVo(a.InvoiceType,b.StartNo,b.EndNo,b.Counts AS Sums,c.Counts,(b.Counts-c.Counts)AS Wsum,(SELECT COUNT(*) FROM IV_Invoice  WHERE Used=1)AS Used,(SELECT COUNT(*) FROM IV_Invoice  WHERE Invalid=1)AS Invalid,(d.counts) AS Archived,(c.Counts-d.counts)AS Wjcount,b.InDate)  FROM IV_Invoice AS a inner JOIN IV_INInvoice AS b ON a.InInvoiceID=b.InInvoiceID inner JOIN IV_OutInvoice AS c ON b.InInvoiceID=c.InInvoiceID inner JOIN iv_archive AS d ON d.InInvoiceID=a.InInvoiceID").list();
		return list;
		}

然后看IV_InvoiceVo类中类型(这个类是我把4张表所查的数据封装在里边了 就是查询语句as 的那些别名那些)

package com.ssh.entity;

import java.util.Date;

public class IV_InvoiceVo {
private int InvoiceType;//发票类型
	private String StartNo;//开始号码
	private String EndNo;//结束号码
	private int Sums;//总张数
	private int  Counts;//出库数
	private int Wsum;//未出数
	private int Used;//已用
	private int Invalid;//作废
	private int Archived;//已交
	private int Wjcount;//未交
	private Date InDate;//入库时间
	//private String EmpName;//入库人
     public IV_InvoiceVo() {
	}
//...省略构造方法
}

jsp页面代码使用的s标签页面过于太长剪短至循环

<thead>
						<tr>
							<th width="80">发票类型</th>
							<th width="80">起始号码</th>
							<th width="80">终止号码</th>
							<th width="60">总张数</th>
							<th width="60">出库数</th>
							<th width="60">未出数</th>
							<th width="60">已用数</th>
							<th width="60">作废数</th>
							<th width="60">待用数</th>
							<th width="60">已交数</th>
							<th width="60">未交数</th>
							<th width="80">入库日期</th>
							<th>入库操作员</th>
						</tr>
					</thead>
					<tbody>
						<s:iterator value="#request.list" var="i">
						<tr>
						<td>
						<s:if test="#i.InvoiceType==0">普通发票</s:if>
						<s:if test="#i.InvoiceType==1">增值税发票</s:if>
						</td>
							<td><s:property value="#i.StartNo"/></td>
							<td><s:property value="#i.EndNo"/></td>
							<td><s:property value="#i.Sums"/></td>
							<td><s:property value="#i.Counts"/></td>
							<td><s:property value="#i.Wsum"/></td>
							<td><s:property value="#i.Used"/></td>
							<td><s:property value="#i.Invalid"/></td>
							<td><s:property value="#i.Counts-#i.Used-#i.Invalid"/></td>
							<td><s:property value="#i.Archived"/></td>
							<td><s:property value="#i.Wjcount"/></td>
							<td><s:property value="#i.InDate"/></td>
							<td>${session.empName}</td>
							
						</tr>
						</s:iterator>
						
					</tbody>

然后再看报错

08:51:09.068 [http-nio-8080-exec-3] ERROR org.hibernate.hql.internal.ast.ErrorCounter -  Invalid path: 'b.StartNo'
org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'b.StartNo'
----
----
----
08:51:09.079 [http-nio-8080-exec-3] ERROR org.hibernate.hql.internal.ast.ErrorCounter -  Invalid path: 'b.Counts'
org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'b.Counts'
----
----
----
08:51:09.080 [http-nio-8080-exec-3] ERROR org.hibernate.hql.internal.ast.ErrorCounter - <AST>:0:0: unexpected end of subtree
antlr.NoViableAltException: unexpected end of subtree

它说我这个b别名没有但是我在数据库中实现这条查询语句是可以执行的

 

select  a.InvoiceType,b.StartNo,b.EndNo,b.Counts AS Sums,c.Counts,(b.Counts-c.Counts)AS Wsum,(SELECT COUNT(*) FROM IV_Invoice  WHERE Used=1)AS Used,(SELECT COUNT(*) FROM IV_Invoice  WHERE Invalid=1)AS Invalid,(d.counts) AS Archived,(c.Counts-d.counts)AS Wjcount,b.InDate,e.EmpName  FROM IV_Invoice AS a inner JOIN IV_INInvoice AS b ON a.InInvoiceID=b.InInvoiceID inner JOIN IV_OutInvoice AS c ON b.InInvoiceID=c.InInvoiceID inner JOIN iv_archive AS d ON d.InInvoiceID=a.InInvoiceID inner JOIN SY_Emp AS e ON a.Empid=e.Empid

然后报那个Bug我仔细改又是找的,然后终于不报这个错了但是又换了一个错mmp...

Path expected for join!

然后我百度了看了这个博主的https://blog.youkuaiyun.com/sinat_36707441/article/details/79421313

说hql不支持join语法。

我的查询语句他是自动生成的,自动生成的语句不太能写编写复杂的,我也不确定。。。。

后面我继续弄,终于解决了这个问题...

1:实体类类型转换定义错了,定义的别名要用long型去封装。有些可能也不一样...

 

	private long Used;//已用
	private long Invalid;//作废
//查询总表
public List<IV_InvoiceVo> findall() {
			// TODO Auto-generated method stub
		//System.out.println("查询总表daoimpl进来了。。。。");
		List<IV_InvoiceVo> list=getSession().createQuery("select new com.ssh.entity.IV_InvoiceVo(a.InvoiceType,b.StartNo,b.EndNo,b.Counts as Sums,c.Counts,(b.Counts-c.Counts)as Wsum,(SELECT COUNT(*) FROM IV_Invoice  WHERE Used=1)as Used,(SELECT COUNT(*) FROM IV_Invoice  WHERE Invalid=1)as Invalid,(d.Counts) as Archived,(c.Counts-d.Counts)as Wjcount,b.InDate)  FROM IV_Invoice a,IV_InInvoice b inner JOIN IV_OutInvoice AS c ON b.InInvoiceID=c.InInvoiceID inner JOIN IV_Archive AS d ON d.InInvoiceID=a.InInvoiceID  and  a.InInvoiceID=b.InInvoiceID ").list();
		return list;
		}

2:关于你建了关系的表要联合起来。:

列如:FROM IV_Invoice a,IV_InInvoice b and a.id=b.id inner join.......

然后还有就是你搭建的关系可能像我这个一样empid在实体类中改为对象了,然后我把它删了,自己

session里调


//	private String EmpName;//入库操作人

3:没有解决不了Bug

事实证明自动生成sql还是可以编译复杂点的语句。。

总结Bug解决方法

1.hql的join不支持没使用外键连接的不同表查询

2.查询语句是你的实体类名称不是数据库里的

3.搭建关系的表要联合

4.实体类里面的你定义的类型要跟sql一样

5.还有就是你多方关系可以选择像我一样session调。哈哈哈

 

 

 

 

在MFC中,使用ODBC API执行SQL查询并比较查询结果特定字段值的操作通常包括以下几个步骤: 1. **建立连接**:首先创建一个`CDAOConnection`或`CDatabase`对象,使用ODBC数据源打开数据库连接。 ```cpp CDatabase db; if (!db.Open(_T("DSN=myDataSrc;SERVER=myServer;DATABASE=myDB;UID=myUser;PWD=myPass"))) { // 处理连接失败 } ``` 这里的参数需要替换为你的实际数据库信息。 2. **执行SQL查询**:创建SQL查询字符串,比如查找某个字段等于特定值的记录。 ```cpp CString strSQL; strSQL.Format(_T("SELECT * FROM myTable WHERE myField = 'expectedValue'")); CAccessor accessor(&db); accessor.ExecSQL(strSQL); // 执行查询 ``` 将`myTable`替换为你要查询的表名,`myField`替换为要比较的字段名,`expectedValue`为预期的字段值。 3. **检查查询结果**:使用`adoRecordset`遍历查询结果,如果找到匹配的行,则比较字段值。 ```cpp adoRecset rs(accessor.GetAdoCommand()); rs.Open(); while (!rs.EOF) { // 比较当前行的myField值 CString currentValue(rs.Fields["myField"].GetAsString()); if (currentValue == _T("expectedValue")) { // 如果相等,这里执行相应的操作 // rs.EOF 设置为False表示还有更多行,继续循环; } else { // 不相等,可以做其他处理 } rs.MoveNext(); } rs.Close(); // 关闭记录集 db.Close(); // 关闭数据库连接 ``` 4. **处理异常**:在整个过程中,别忘了处理可能出现的运行时错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值