hibernate 使用sql語句級聯查詢問題,可追加!



select o.orderid,u.name from benz.pojo.Order as o join benz.pojo.User as u on o.user_ = u.id where u.id = 97

比如這樣的sql語句。
在hibernate中使用SQLQuery接口查詢  on  這個關鍵字一直報錯

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 76 [select o.orderid,u.name from benz.pojo.Order as o join benz.pojo.User as u on o.user_ = u.id where u.id = 97]
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
at benz.DAO.OrderDAO.findByOther(OrderDAO.java:30)
at benz.struts.action.OrderAction.order(OrderAction.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at benz.tools.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:43)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:619)
Caused by: line 1:76: unexpected token: on
at org.hibernate.hql.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1765)
at org.hibernate.hql.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1420)
at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1130)
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702)
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:238)
... 39 more


找了些資料但是還是不完全。

如果user_表 和order_ 表之間,或者多個表之間的關系比較復雜。即用多個join  關聯查詢。而且映射關系不明顯,想直接用sql語句來執行。
有沒有更好的辦法,在hibernate中執行語句,而且重要的是返回的是List集合沒錯,但是想返回一個我自己定義的pojo的集合。


class Info{
private int id;
private String name;

get()....set()...
}

想執行完返回這個對象集合 高手請進。很急

14 个解决方案

#1


select o.orderid,u.name from 
benz.pojo.Order o 
inner join  (or left outer join )benz.pojo.User u on o.user_ = u.id 
where u.id = 97

#2


HQL聯合查詢
1,inner join [fetch]
2,left outer join [fetch]
3,right outer join [fetch]
4,full join [fetch]

#3


final String sql ="select o.orderid,u.name " +
"from benz.pojo.Order o " +
"inner join (or left outer join )benz.pojo.User u on o.user_ = u.id " +
"where u.id = 97";
SQLQuery query = (SQLQuery) this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
return session.createSQLQuery(sql);
}
});
List<Info> list = query.list();

#4


返回info對象的list >_<

#5



String sql ="select o.orderid,u.name " +
"from benz.pojo.Order o " +
"inner join (or left outer join )benz.pojo.User u on o.user_ = u.id " +
"where u.id = 97";
session = this.getSession();
tran = session.beginTransaction();
SQLQuery sQuery = session.createSQLQuery(sql);
List<Info> list = sQuery.list();
tran.commit();

不能執行


org.hibernate.exception.SQLGrammarException: could not execute query
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.loader.Loader.doList(Loader.java:2148)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
org.hibernate.loader.Loader.list(Loader.java:2024)
org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1655)
org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
benz.DAO.OrderDAO.findByOther(OrderDAO.java:33)
benz.struts.action.OrderAction.order(OrderAction.java:80)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
benz.tools.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:43)

#6


使用hib的關系配置吧,Hib不配關系,就不是蠻好,效率蠻低

#7



select o.orderid,u.name from benz.pojo.Order as o join benz.pojo.User as u on o.user_ = u.id where u.id = 97


Order跟User應該是多對一關系吧,在這基礎上要是不列出所有字段,可用下面hql:

from benz.pojo.Order o left join fetch o.user u where u.id = 97


要包含字段的話,用下面sql:

select o.orderid,u.name from benz.pojo.Order o left join o.user u where u.id = 97

#8


我現在就是想脫離hql  
用hibernate去執行純的sql

2個表用one-to-many還好說

要是多個表之間join hql語句寫起來很麻煩
而且SQLQuery接口就是用來處理sql的。但是太不靈活了

繼續等待

#9


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

String sql ="select o.orderid,u.name " +
        "from benz.pojo.Order o " +
        "inner join benz.pojo.User u on o.user_ = u.id " +
        "where u.id = 97";


OR
String sql ="select o.orderid,u.name " +
        "from benz.pojo.Order o " +
        "left outer join benz.pojo.User u on o.user_ = u.id " +
        "where u.id = 97";


#10


引用 8 樓 huangyangweiyue 的回復:
我現在就是想脫離hql  
用hibernate去執行純的sql 

2個表用one-to-many還好說 

要是多個表之間join hql語句寫起來很麻煩 
而且SQLQuery接口就是用來處理sql的。但是太不靈活了 

繼續等待


還等待...
我的方法不行嗎?

#11


來學習了~~~~~~

#12


我建議lz創建Connection對象,然后操作JDBC

#13


class Info{
private int id;
private String name;
public Info(int id, String name){
 this.id = id;
 this.name = name;
}

get()....set()...
}

類Info中多增加一個帶參的構造方法,再hql語句寫成這樣試試看:

select new Info(o.id, u.name) from benz.pojo.Order as o join o.user as u where  u.id = 97

#14


引用 8 樓 huangyangweiyue 的回復:
我現在就是想脫離hql  
用hibernate去執行純的sql 

Session session = ...;
String sql = "你的SQL語句,不是HQL";
Query query = session.createSQLQuery(sql);
這不就脫離了hql,用hibernate去執行純的sql了嗎?

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com