[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2258) Bad SQL Grammer: Implicit join when using r.fooClass.attributes[?]=?

Darryl Miles (JIRA) noreply at atlassian.com
Sun Nov 2 08:41:04 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2258?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=31572#action_31572 ] 

Darryl Miles commented on HHH-2258:
-----------------------------------

Attached is a logging output of testcase here are the notable entries.

13:34:02,609 DEBUG DotNode:591 - getDataType() : productDetail -> org.hibernate.type.ManyToOneType(org.hibernate.test.joinedmapfilter.ProductDetail)
13:34:02,610 DEBUG DotNode:390 - dereferenceEntityJoin() : generating join for productDetail in org.hibernate.test.joinedmapfilter.Toplevel {no alias} parent = [  ( . ( . toplevel0_.toplevel_id productDetail ) attributes ) ]
13:34:02,616 DEBUG FromElement:131 - FromClause{level=1} :  org.hibernate.test.joinedmapfilter.ProductDetail (no alias) -> productdet1_
13:34:02,617 DEBUG FromClause:257 - addJoinByPathMap() : r.productDetail -> product_detail productdet1_
13:34:02,618 DEBUG FromReferenceNode:74 - Resolved :  r.productDetail -> toplevel0_.product_detail_id


Notice here the 2nd FROM_FRAGMENT of ImpliedFromElement with '' as the getText().  This should be 'product_detail productdet1_' you can see it knows the tableName and tableAlias but the getText() is blank.


13:34:02,680 DEBUG AST:258 - --- SQL AST ---
 \-[SELECT] QueryNode: 'SELECT'  querySpaces (product_detail_attrs,toplevel,product_detail)
    +-[SELECT_CLAUSE] SelectClause: '{select clause}'
    |  +-[ALIAS_REF] IdentNode: 'toplevel0_.toplevel_id as toplevel1_0_' {alias=r, className=org.hibernate.test.joinedmapfilter.Toplevel, tableAlias=toplevel0_}
    |  \-[SQL_TOKEN] SqlFragment: 'toplevel0_.long_value_one as long2_0_, toplevel0_.product_detail_id as product3_0_, toplevel0_.description as descript4_0_'
    +-[FROM] FromClause: 'FROM' FromClause{level=1, fromElementCounter=2, fromElements=3, fromElementByClassAlias=[r], fromElementByTableAlias=[toplevel0_, productdet1_, attributes2_], fromElementsByPath=[r.productDetail], collectionJoinFromElementsByPath=[r.productDetail.attributes], impliedElements=[]}
    |  +-[FROM_FRAGMENT] FromElement: 'toplevel toplevel0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=r,role=null,tableName=toplevel,tableAlias=toplevel0_,origin=null,colums={,className=org.hibernate.test.joinedmapfilter.Toplevel}}
    |  +-[FROM_FRAGMENT] ImpliedFromElement: '' ImpliedFromElement{implied,collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName=product_detail,tableAlias=productdet1_,origin=toplevel toplevel0_,colums={toplevel0_.product_detail_id ,className=org.hibernate.test.joinedmapfilter.ProductDetail}}
    |  \-[FROM_FRAGMENT] ImpliedFromElement: 'product_detail_attrs attributes2_' ImpliedFromElement{implied,collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=org.hibernate.test.joinedmapfilter.ProductDetail.attributes,tableName={none},tableAlias=attributes2_,origin=toplevel toplevel0_,colums={,className=null}}
    \-[WHERE] SqlNode: 'WHERE'
       +-[THETA_JOINS] SqlNode: '{theta joins}'
       |  +-[SQL_TOKEN] SqlFragment: 'toplevel0_.product_detail_id=productdet1_.product_detail_id'
       |  \-[SQL_TOKEN] SqlFragment: 'productdet1_.product_detail_id=attributes2_.product_detail_id and attributes2_.name = ?'
       \-[AND] SqlNode: 'AND'
          +-[EQ] BinaryLogicOperatorNode: '='
          |  +-[DOT] DotNode: 'toplevel0_.toplevel_id' {propertyName=toplevelId,dereferenceType=4,propertyPath=toplevelId,path=r.toplevelId,tableAlias=toplevel0_,className=org.hibernate.test.joinedmapfilter.Toplevel,classAlias=r}
          |  |  +-[ALIAS_REF] IdentNode: 'toplevel0_.toplevel_id' {alias=r, className=org.hibernate.test.joinedmapfilter.Toplevel, tableAlias=toplevel0_}
          |  |  \-[IDENT] IdentNode: 'toplevelId' {originalText=toplevelId}
          |  \-[PARAM] ParameterNode: '?' {ordinal=0, expectedType=org.hibernate.type.LongType at 6e3e5e}
          \-[EQ] BinaryLogicOperatorNode: '='
             +-[INDEX_OP] IndexNode: 'attributes2_.value' {ImpliedFromElement{implied,collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=org.hibernate.test.joinedmapfilter.ProductDetail.attributes,tableName={none},tableAlias=attributes2_,origin=toplevel toplevel0_,colums={,className=null}}}
             |  +-[DOT] DotNode: '.' {propertyName=attributes,dereferenceType=3,propertyPath=attributes,path=r.productDetail.attributes,tableAlias=attributes2_,className=null,classAlias=null}
             |  |  +-[DOT] DotNode: 'toplevel0_.product_detail_id' {propertyName=productDetail,dereferenceType=1,propertyPath=productDetail,path=r.productDetail,tableAlias=productdet1_,className=org.hibernate.test.joinedmapfilter.ProductDetail,classAlias=null}
             |  |  |  +-[ALIAS_REF] IdentNode: 'toplevel0_.toplevel_id' {alias=r, className=org.hibernate.test.joinedmapfilter.Toplevel, tableAlias=toplevel0_}
             |  |  |  \-[IDENT] IdentNode: 'productDetail' {originalText=productDetail}
             |  |  \-[IDENT] IdentNode: 'attributes' {originalText=attributes}
             |  \-[PARAM] ParameterNode: '?' {ordinal=1, expectedType=null}
             \-[PARAM] ParameterNode: '?' {ordinal=2, expectedType=null}


There is also ./core/src/main/java/org/hibernate/hql/ast/SqlGenerator.java around line 249.  I guess my missing table in the FROM clause is one of these "ghosts".

                ///////////////////////////////////////////////////////////////////////
                // HACK ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!
                // Attempt to work around "ghost" ImpliedFromElements that occasionally
                // show up between the actual things being joined.  This consistently
                // occurs from index nodes (at least against many-to-many).  Not sure
                // if there are other conditions
                //
                // Essentially, look-ahead to the next FromElement that actually
                // writes something to the SQL
                while ( right != null && !hasText( right ) ) {
                        right = ( FromElement ) right.getNextSibling();
                }
                if ( right == null ) {
                        return;
                }
                ///////////////////////////////////////////////////////////////////////


> Bad SQL Grammer: Implicit join when using r.fooClass.attributes[?]=?
> --------------------------------------------------------------------
>
>                 Key: HHH-2258
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2258
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.1.3
>         Environment: MySQL server this has been tested with.
>            Reporter: Darryl Miles
>            Priority: Critical
>         Attachments: HHH-2258.txt, test_joinedmapfilter.zip
>
>
> Please find this test case atteched to demonstrate the bug, maybe you can add to the hibernate distribution for future testing and piece of mind for me.
> The error:
> Testsuite: org.hibernate.test.joinedmapfilter.JoinedMapFilterTest
> Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.498 sec
> Testcase: testJoinedMapFilter took 0.495 sec
>         Caused an ERROR
> could not execute query
> 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:2147)
>         at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
>         at org.hibernate.loader.Loader.list(Loader.java:2023)
>         at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393)
>         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 org.hibernate.test.joinedmapfilter.JoinedMapFilterTest.testJoinedMapFilter(JoinedMapFilterTest.java:116)
>         at org.hibernate.test.TestCase.runTest(TestCase.java:250)
>         at org.hibernate.test.TestCase.runBare(TestCase.java:316)
> Caused by: java.sql.SQLException: Unknown table 'productdet1_' in where clause
>         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
>         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
>         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
>         at com.mysql.jdbc.Connection.execSQL(Connection.java:2994)
>         at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:936)
>         at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1030)
>         at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
>         at org.hibernate.loader.Loader.getResultSet(Loader.java:1668)
>         at org.hibernate.loader.Loader.doQuery(Loader.java:662)
>         at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
>         at org.hibernate.loader.Loader.doList(Loader.java:2144)
>         ... 25 more
> SELECT r FROM com.company.Toplevel AS r WHERE r.toplevel=? AND rec.productDetail.attributes[?]=? 
> Also my recent post: http://forum.hibernate.org/viewtopic.php?t=966374&start=0&postdays=0&postorder=asc&highlight=
> This testcase has been tested with 3.1.3 and 3.2.0-ga.
> 2nd problem:
> There is also another situation in the testcase which I found through serendipity which causes a NPE inside hibernate because I misspelled "r" as "rec".  Check out the commented out section and swap over the createQuery() lines to demonstrate that NPE.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list