在线等...急。。。 求一hibernate查询语句的错误

ypchengmsdn 2009-12-06 07:55:33



用外连接查询时,抛出以下错误,但我在SQL2005中查询是没有问题的,有结果的,怎么一用到HQL语句,就这样呢?
语句是:
String hql = "selectGoods_firstType.fType_name,Goods_scondsType.sType_name,
Goods_info.goods_name,Goods_save.save_num,Goods_save.save_time,Goods_save.save_addNum,
Goods_save.save_addTime from Goods_save
left join Goods_info on Goods_save.Goods_id = Goods_info.Goods_id
left join Goods_firstType on Goods_info.fType_id = Goods_firstType.fType_id
left join Goods_scondsType on Goods_info.sType_id = Goods_scondsType.sType_id
where Goods_save.save_num < (select alert_num from goods_saveinfo)";

我用getHibernateTemplate().find(hql);

抛出以下异常:
2009-12-06 19:31:59,328 ERROR [org.hibernate.hql.PARSER] - line 1:238: unexpected token: on
2009-12-06 19:31:59,328 ERROR [org.hibernate.hql.PARSER] - line 1:309: unexpected token: on
2009-12-06 19:31:59,328 ERROR [org.hibernate.hql.PARSER] - line 1:386: unexpected token: on

2009-12-6 19:31:59 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 238 [select Goods_firstType.fType_name,Goods_scondsType.sType_name,Goods_info.goods_name,Goods_save.save_num,Goods_save.save_time,Goods_save.save_addNum,Goods_save.save_addTime from shengye.IEshopping.sky.bean.Goods_save left join Goods_info on Goods_save.Goods_id = Goods_info.Goods_id left join Goods_firstType on Goods_info.fType_id = Goods_firstType.fType_id left join Goods_scondsType on Goods_info.sType_id = Goods_scondsType.sType_id where Goods_save.save_num < (select alert_num from goods_saveinfo)]

郁闷,说是left join on 附近,但我找了半天,未果,但同样的语句在SQL2005可以执行啊? 肯请各位大哥大姐们帮帮忙???


...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyong1024757684 2009-12-08
  • 打赏
  • 举报
回复
使用Hibernate会有一个延时加载错误 我们可以在其配置文件里进行修改 但是这样的效率不高
一般我要使用抓取技术
hejuan250229087 2009-12-07
  • 打赏
  • 举报
回复
你写的是HQL语句???
如果是的话就思路错了,真是hql语句的话是不可以在sql2005中使用的

真是HQL语句的话,从这样就开始有问题了
left join Goods_info on Goods_save.Goods_id = Goods_info.Goods_id
left join Goods_firstType on Goods_info.fType_id = Goods_firstType.fType_id
left join Goods_scondsType on Goods_info.sType_id = Goods_scondsType.sType_id
where Goods_save.save_num < (select alert_num from goods_saveinfo)";

因为我不知道你的对象里的字段,所以这里简单用一个例子吧

如Emp表中有Dep字段
而Emp类中有一个Dep对象
from Emp e left join e.Dep d where d.depId=15;

Hql语句里不要用到on 表.Id=表.Id
道光2008 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ypchengmsdn 的回复:]
3楼能说的具体点吗
[/Quote]
就是说你的表直接要建立外键关系,你的hibernate的映射文件要建立级联关系,才能使用left join on
ypchengmsdn 2009-12-07
  • 打赏
  • 举报
回复
楼上说的对,不过这个问题我已经解决了:
所以现在过来结贴,我是这样的解决的,总结一下:
的确,像6楼所说的,不能使用关键字on,只要用到表的映射关系就行了,
你只要写<ont-to-many>中或<many-to-one>中的name的名字就可以了,因为hibernate已经
帮你做好了这些映射。比如:left join gs.goods_infos gi
红色为name的名字。

this.getHibernateTemplate().find("select gft.fType_name,gst.sType_name," +
"gi.Goods_name,gs.save_num,gs.save_time," +
"gs.save_addNum,gs.save_addTime from Goods_save gs "+
"left join gs.goods_infos gi "+
"left join gi.goods_ftype gft "+
"left join gi.goods_stype gst "+
"where gs.save_num < (select gsi.alert_num from Goods_saveInfo gsi)");


后来发现返回的结果是一个list,但要取得list的值,还要遍历,
因为我这返回的是单个字段,不是对象,所以我又用:

obj = (Object[])list1.get(i);
obj[0]..就是你要的字段。。。

把里面的字段用一个类来封装,这样就可以使用了。。。在此总结一下,献丑了。。
gxhuanggz 2009-12-06
  • 打赏
  • 举报
回复
hql不是sql,我记得hql里面连接的时候是不用加on这个条件的
把所有的on条件去掉
ypchengmsdn 2009-12-06
  • 打赏
  • 举报
回复
3楼能说的具体点吗
ypchengmsdn 2009-12-06
  • 打赏
  • 举报
回复
。。。。。
道光2008 2009-12-06
  • 打赏
  • 举报
回复
Goods_save
left join Goods_info on Goods_save.Goods_id = Goods_info.Goods_id
left join Goods_firstType on Goods_info.fType_id = Goods_firstType.fType_id
left join Goods_scondsType on Goods_info.sType_id = Goods_scondsType.sType_id

这几个表映射的实体都建立管理没有,如果没有是不能用left join on的
ypchengmsdn 2009-12-06
  • 打赏
  • 举报
回复
那个是我刚才贴代码的时候,忘记空格了,我的程序里是有的
语句是:

select Goods_firstType.fType_name,Goods_scondsType.sType_name,
Goods_info.goods_name,Goods_save.save_num,Goods_save.save_time,
Goods_save.save_addNum,Goods_save.save_addTime from Goods_save
left join Goods_info on Goods_save.Goods_id = Goods_info.Goods_id
left join Goods_firstType on Goods_info.fType_id = Goods_firstType.fType_id
left join Goods_scondsType on Goods_info.sType_id = Goods_scondsType.sType_id
where Goods_save.save_num < (select alert_num from goods_saveinfo)


baimalangren 2009-12-06
  • 打赏
  • 举报
回复
"selectGoods_firstType. 中间少个空格

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧