- - PR -
Hibernate 結合マッピングが存在しないクラス同士のJoin方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-01 11:50
手元に当時のソースが無いのでうろ覚えですが、上記の書き方は HQL的に間違っているのではないでしょうか? http://www.hibernate.org/hib_docs/reference/ja/html/queryhql.html を参考にいろいろ試してください。 | ||||||||
|
投稿日時: 2005-03-01 13:23
おかもと様、ありがとうございます。
教えていただいたURLを参考に試してみます。 | ||||||||
|
投稿日時: 2005-03-01 14:24
下記の件について、著者様の意見をお聞きしたいのですが、ルール違反になるのでしょうか?
| ||||||||
|
投稿日時: 2005-03-01 16:59
おかもとさん、yellowfd3sさんこんにちは。
引用: -------------------------------------------------------------------------------- やはり実際の開発で使用するとなるとHQLを書かないわけには行かないですよ。 さらに、HQLでは解決できないところはSQLを書く羽目になりJDBCのみで 作成したアプリケーションよりも保守が大変になります・・・。 -------------------------------------------------------------------------------- 興味深いお話ですね。私も今度案件にhibernateを使うかもしれませんので、 具体的にどういうところが、HQLでは解決できないなかったのかがすごく興味を持ちました。 yellowfd3sさん、そのコードは間違っていないと思いますよ。 私のコンソールにでてくるHQLもそれと同じHQLが出力さえていますから。 私のはleft outer join ですが。 どんなエラーが出ているのか教えていただければ力になれるかもしれません。 | ||||||||
|
投稿日時: 2005-03-01 18:01
abby様、こんにちわ。
私もleft outer joinを行いました。 Oracle8iがleft join, right join をサポートしていないのでエラーになっているのではと 憶測しています。 環境とエラー内容(かなり長いです。)は下記の通りです。 環境 JDK:1.4.2_07 DB:Oracle8i(8.1.7) Tomcat:5.0.28 Hibernate:2.1.8 SpringFramework:1.1.5 エラー内容 2005-03-01 17:54:02,502 FATAL [http-8080-Processor25] [common.struts.SystemExceptionHandler 52] - common.dao.DAOException: Couldn't find all Tankas. at purchase2.dao.hibernate.TankaDAOImpl.findAll(TankaDAOImpl.java:145) at purchase2.dao.hibernate.TankaDAOImpl.findAll(TankaDAOImpl.java:113) 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:324) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:284) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:56) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) at $Proxy5.findAll(Unknown Source) at purchase2.biz.TankaBiz.findAll(TankaBiz.java:123) at purchase2.actions.TankaSelectAction.execute(TankaSelectAction.java:53) at org.twdata.struts.SpringAction.execute(SpringAction.java:85) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) Caused by: org.springframework.orm.hibernate.HibernateQueryException: outer or full join must be followed by path expression [from purchase2.model.Tanka tnk left outer join Torihiki trhk where tnk.toricd = trhk.toricd order by tnk.kyoutei]; nested exception is net.sf.hibernate.QueryException: outer or full join must be followed by path expression [from purchase2.model.Tanka tnk left outer join Torihiki trhk where tnk.toricd = trhk.toricd order by tnk.kyoutei] at org.springframework.orm.hibernate.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:615) at org.springframework.orm.hibernate.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:234) at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:317) at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:289) at purchase2.dao.hibernate.TankaDAOImpl.findAll(TankaDAOImpl.java:129) ... 48 more Caused by: net.sf.hibernate.QueryException: outer or full join must be followed by path expression [from purchase2.model.Tanka tnk left outer join Torihiki trhk where tnk.toricd = trhk.toricd order by tnk.kyoutei] at net.sf.hibernate.hql.FromParser.token(FromParser.java:166) at net.sf.hibernate.hql.ClauseParser.token(ClauseParser.java:87) at net.sf.hibernate.hql.PreprocessingParser.token(PreprocessingParser.java:123) at net.sf.hibernate.hql.ParserHelper.parse(ParserHelper.java:29) at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:149) at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:138) at net.sf.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:295) at net.sf.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:1572) at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1543) at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:49) at purchase2.dao.hibernate.TankaDAOImpl$3.doInHibernate(TankaDAOImpl.java:140) at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:312) ... 50 more | ||||||||
|
投稿日時: 2005-03-02 00:31
caseが使えませんでした。あと、外部結合が自由自在って訳には 行かなかったですね。詳しくはHibernateの話題を日本語で扱っている メーリングリストの過去ログを参照してください。
そうでしたか。hoge outer join とやったときは、whereの部分はonに なると思っていました。 tableA as a left outer join tableB as b on a.column = b.column みたいに。上のはSQLですけど・・・。 | ||||||||
|
投稿日時: 2005-03-02 00:40
Hibernateは対応していてOracleが対応していないのなら Oracleの方がSQLExceptionを投げると思うのですが・・・。 ちょっと、私の方ではこれ以上助言できることは難しいです。 HQLを含むソースとマッピングファイル、テーブルの永続化クラスを 合わせて提示してみて意見を伺ってみてはどうでしょうか? | ||||||||
|
投稿日時: 2005-03-02 10:54
おかもとさん、
回答を頂きありがとうございました。 やはり、結合あたりはうまくいきませんよね。 やり方はあるかもしれませんが情報が少ない(私の探し方に問題があるのかも)ので。 yellowfd3sさん、 >>Oracle8iがleft join, right join をサポートしていない 8iはよく知らないのでこれの可能性は捨てきれませんが、 基本的にオラクル側で出るエラーは私の場合はJDBCExceptionとして出ているので yellowfd3sさんの場合はその一歩前ではないかと思います。 おかもとさんの言うとおりに、ソース等を提示しただけるといいかと思います。 ちなみに9iではwhere でも on でも稼動すると思います。 ただ私は自動生成させているので勝手にWhereとなるだけですので。 |