- PR -

Hibernate 結合マッピングが存在しないクラス同士のJoin方法

投稿者投稿内容
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2005-03-01 11:50
引用:

yellowfd3sさんの書き込み (2005-03-01 11:05) より:
連載:Hibernateで理解するO/Rマッピング(5)のPage2のように記述すると
エラーとなってしまいました。
http://www.atmarkit.co.jp/fjava/rensai3/ormap05/ormap05_2.html

 From package.ClassA as clA right outer join
 package.ClassB as clB
 Where clA.objID = clB.objID




手元に当時のソースが無いのでうろ覚えですが、上記の書き方は
HQL的に間違っているのではないでしょうか?

http://www.hibernate.org/hib_docs/reference/ja/html/queryhql.html

を参考にいろいろ試してください。
yellowfd3s
会議室デビュー日: 2005/02/16
投稿数: 15
投稿日時: 2005-03-01 13:23
おかもと様、ありがとうございます。

教えていただいたURLを参考に試してみます。
yellowfd3s
会議室デビュー日: 2005/02/16
投稿数: 15
投稿日時: 2005-03-01 14:24
下記の件について、著者様の意見をお聞きしたいのですが、ルール違反になるのでしょうか?

引用:

おかもとさんの書き込み (2005-03-01 11:50) より:
引用:

yellowfd3sさんの書き込み (2005-03-01 11:05) より:
連載:Hibernateで理解するO/Rマッピング(5)のPage2のように記述すると
エラーとなってしまいました。
http://www.atmarkit.co.jp/fjava/rensai3/ormap05/ormap05_2.html

 From package.ClassA as clA right outer join
 package.ClassB as clB
 Where clA.objID = clB.objID




手元に当時のソースが無いのでうろ覚えですが、上記の書き方は
HQL的に間違っているのではないでしょうか?

http://www.hibernate.org/hib_docs/reference/ja/html/queryhql.html

を参考にいろいろ試してください。

abby
会議室デビュー日: 2005/02/18
投稿数: 13
投稿日時: 2005-03-01 16:59
おかもとさん、yellowfd3sさんこんにちは。

引用:
--------------------------------------------------------------------------------
やはり実際の開発で使用するとなるとHQLを書かないわけには行かないですよ。
さらに、HQLでは解決できないところはSQLを書く羽目になりJDBCのみで
作成したアプリケーションよりも保守が大変になります・・・。

--------------------------------------------------------------------------------

興味深いお話ですね。私も今度案件にhibernateを使うかもしれませんので、
具体的にどういうところが、HQLでは解決できないなかったのかがすごく興味を持ちました。

yellowfd3sさん、そのコードは間違っていないと思いますよ。
私のコンソールにでてくるHQLもそれと同じHQLが出力さえていますから。
私のはleft outer join ですが。

どんなエラーが出ているのか教えていただければ力になれるかもしれません。


yellowfd3s
会議室デビュー日: 2005/02/16
投稿数: 15
投稿日時: 2005-03-01 18:01
abby様、こんにちわ。

引用:


yellowfd3sさん、そのコードは間違っていないと思いますよ。
私のコンソールにでてくるHQLもそれと同じHQLが出力さえていますから。
私のはleft outer join ですが。

どんなエラーが出ているのか教えていただければ力になれるかもしれません。




私も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
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2005-03-02 00:31
引用:

abbyさんの書き込み (2005-03-01 16:59) より:
興味深いお話ですね。私も今度案件にhibernateを使うかもしれませんので、
具体的にどういうところが、HQLでは解決できないなかったのかがすごく興味を持ちました。



caseが使えませんでした。あと、外部結合が自由自在って訳には
行かなかったですね。詳しくはHibernateの話題を日本語で扱っている
メーリングリストの過去ログを参照してください。

引用:

yellowfd3sさん、そのコードは間違っていないと思いますよ。
私のコンソールにでてくるHQLもそれと同じHQLが出力さえていますから。
私のはleft outer join ですが。




そうでしたか。hoge outer join とやったときは、whereの部分はonに
なると思っていました。

tableA as a left outer join tableB as b on a.column = b.column

みたいに。上のはSQLですけど・・・。
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2005-03-02 00:40
引用:

yellowfd3sさんの書き込み (2005-03-01 18:01) より:
私もleft outer joinを行いました。
Oracle8iがleft join, right join をサポートしていないのでエラーになっているのではと




Hibernateは対応していてOracleが対応していないのなら
Oracleの方がSQLExceptionを投げると思うのですが・・・。

ちょっと、私の方ではこれ以上助言できることは難しいです。
HQLを含むソースとマッピングファイル、テーブルの永続化クラスを
合わせて提示してみて意見を伺ってみてはどうでしょうか?
abby
会議室デビュー日: 2005/02/18
投稿数: 13
投稿日時: 2005-03-02 10:54
おかもとさん、
回答を頂きありがとうございました。
やはり、結合あたりはうまくいきませんよね。
やり方はあるかもしれませんが情報が少ない(私の探し方に問題があるのかも)ので。

yellowfd3sさん、

>>Oracle8iがleft join, right join をサポートしていない
8iはよく知らないのでこれの可能性は捨てきれませんが、
基本的にオラクル側で出るエラーは私の場合はJDBCExceptionとして出ているので
yellowfd3sさんの場合はその一歩前ではないかと思います。

おかもとさんの言うとおりに、ソース等を提示しただけるといいかと思います。
ちなみに9iではwhere でも on でも稼動すると思います。
ただ私は自動生成させているので勝手にWhereとなるだけですので。

スキルアップ/キャリアアップ(JOB@IT)