Hibernate Joins fail if you use Derby (aliases in select clause trump aliases
in from and where clauses)
--------------------------------------------------------------------------------------------------------
Key: DERBY-2970
URL: https://issues.apache.org/jira/browse/DERBY-2970
Project: Derby
Issue Type: Bug
Affects Versions: 10.3.1.2
Environment: Hibernate v3, Derby 10.3.1.2, Sun's Java 1.6.0_01
Reporter: Charlie Hubbard
Using hibernate to do a simple join causes an unknown field exception from
derby's libraries. Hibernate uses a mixture of aliases to specify the select
clause which is different from the aliases used in the from and where clauses.
While strange this is perfectly legal to do. My tables have a very simple
structure. Customer has many licenses and they are linked by the shared
customer ID field. So it looks something like:
Customers:
---------------
id : identity
name : varchar(80)
...
LicenseKeys:
-----------------
id : identity
CustomerID : int
LicenseKey : varchar(256)
...
Here is the HQL I tried to execute against the DB:
select c, key from Customer c join c.keys as key where key.expirationDate <
current_timestamp() or key.maintenanceDate < current_timestamp()
Here is the SQL generated by hibernate:
Hibernate:
select
customer0_.id as id0_0_,
keys1_.id as id1_1_,
customer0_.address as address0_0_,
customer0_.city as city0_0_,
customer0_.company as company0_0_,
customer0_.email as email0_0_,
customer0_.name as name0_0_,
customer0_.state as state0_0_,
customer0_.zipcode as zipcode0_0_,
keys1_.creationDate as creation2_1_1_,
keys1_.CustomerID as CustomerID1_1_,
keys1_.expirationDate as expirati3_1_1_,
keys1_.licenseKey as licenseKey1_1_,
keys1_.maintenanceDate as maintena5_1_1_,
keys1_.serialNumber as serialNu6_1_1_,
keys1_.trial as trial1_1_
from
APP.Customers customer0_
inner join
APP.LicenseKeys keys1_
on customer0_.id=keys1_.CustomerID
where
keys1_.expirationDate<current timestamp
or keys1_.maintenanceDate<current timestamp
Here is the error coming out of my log file:
2007-07-24 09:48:38,357 [btpool0-4] WARN
org.hibernate.util.JDBCExceptionReporter - SQL Error: 30000, SQLState: 42X04
2007-07-24 09:48:38,357 [btpool0-4] ERROR
org.hibernate.util.JDBCExceptionReporter - Column 'CUSTOMER0_.ID' is either
not in any table in the FROM list or appears within a join specification and is
outside the scope of the join specification or appears in a HAVING clause and
is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then
'CUSTOMER0_.ID' is not a column in the target table.
2007-07-24 09:48:40,107 [Mail loader] INFO
com.emailarchive.demon.MailDemonLoader - Completed polling cycle in 922 ms.
Found 0 messages.
2007-07-24 09:48:40,482 [btpool0-4] WARN
org.hibernate.util.JDBCExceptionReporter - SQL Warning: 10000, SQLState: 01J01
2007-07-24 09:48:40,482 [btpool0-4] WARN
org.hibernate.util.JDBCExceptionReporter - Database
'webapps/licensingserver/WEB-INF/licensing' not created, connection made to
existing database instead.
2007-07-24 09:48:40.482::WARN: EXCEPTION
net.sourceforge.stripes.exception.StripesServletException: Unhandled exception
caught by the default exception handler.
at
net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:40)
at
net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:184)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:185)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:689)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:391)
at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:146)
at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:285)
at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:457)
at
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:751)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:500)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:209)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:329)
at
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475)
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
at
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2223)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
at
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
at
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at
com.emailarchive.licensing.web.controller.AdministrationActionBean.expired(AdministrationActionBean.java:44)
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
net.sourceforge.stripes.controller.DispatcherHelper$6.intercept(DispatcherHelper.java:445)
at
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:157)
at
net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:107)
at
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:154)
at
net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:73)
at
net.sourceforge.stripes.controller.DispatcherHelper.invokeEventHandler(DispatcherHelper.java:443)
at
net.sourceforge.stripes.controller.DispatcherServlet.invokeEventHandler(DispatcherServlet.java:241)
at
net.sourceforge.stripes.controller.DispatcherServlet.doPost(DispatcherServlet.java:154)
at
net.sourceforge.stripes.controller.DispatcherServlet.doGet(DispatcherServlet.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:491)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1074)
at
net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:181)
... 17 more
Caused by: java.sql.SQLSyntaxErrorException: Column 'CUSTOMER0_.ID' is either
not in any table in the FROM list or appears within a join specification and is
outside the scope of the join specification or appears in a HAVING clause and
is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then
'CUSTOMER0_.ID' is not a column in the target table.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown
Source)
at
org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
Source)
at
org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown
Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown
Source)
at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown
Source)
at
org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
at
org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:423)
at
org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
at org.hibernate.loader.Loader.doQuery(Loader.java:673)
at
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
... 43 more
Caused by: java.sql.SQLException: Column 'CUSTOMER0_.ID' is either not in any
table in the FROM list or appears within a join specification and is outside
the scope of the join specification or appears in a HAVING clause and is not in
the GROUP BY list. If this is a CREATE or ALTER TABLE statement then
'CUSTOMER0_.ID' is not a column in the target table.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at
org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
Source)
... 63 more
Caused by: ERROR 42X04: Column 'CUSTOMER0_.ID' is either not in any table in
the FROM list or appears within a join specification and is outside the scope
of the join specification or appears in a HAVING clause and is not in the GROUP
BY list. If this is a CREATE or ALTER TABLE statement then 'CUSTOMER0_.ID' is
not a column in the target table.
at org.apache.derby.iapi.error.StandardException.newException(Unknown
Source)
at
org.apache.derby.impl.sql.compile.ColumnReference.bindExpression(Unknown Source)
at
org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(Unknown Source)
at
org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(Unknown
Source)
at org.apache.derby.impl.sql.compile.SelectNode.bindExpressions(Unknown
Source)
at
org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(Unknown
Source)
at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown
Source)
at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown
Source)
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
at
org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown
Source)
... 57 more
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.