[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3003) Native SQL Query module not able to find the alias for collections when property name is not "*"

Max Rydahl Andersen (JIRA) noreply at atlassian.com
Sat Dec 8 04:03:57 EST 2007


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3003?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29100 ] 

Max Rydahl Andersen commented on HHH-3003:
------------------------------------------

this depends greatly on what mapping you are using. did all the sqlqueries tests still pass?

have you read the docs on how the {} syntax works for collections ?

> Native SQL Query module not able to find the alias for collections when property name is not  "*"
> -------------------------------------------------------------------------------------------------
>
>                 Key: HHH-3003
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3003
>             Project: Hibernate3
>          Issue Type: Patch
>          Components: query-sql
>    Affects Versions: 3.2.5
>         Environment: Hibernate 3.2.5.ga, Oracle 9i
>            Reporter: Viral B
>         Attachments: Native SQL Collection ALias Patch.zip
>
>
> SQLQueryParser  replaces query aliases and property names with corresponding auto generated aliases.
> The probelm is if we use {aliasName.*} then everything works fine , but along with {aliasName.*} , if you use {aliasName.propertyName} then it doesnot work if the alias is a collection but works if aliasName is an Entity.
> To testify this I created two hibernate files Employee and Department , Department has many employees
> I wrote the following testcase,
> public void testNativeSqlQueryCollectionAliasDefect() {
> 		String query = "select * from ( select {d.*},{e.*} "
> 				+ " from department d, employee e where d.department_id = e.department_id " +
> 						" ) where {e.id} = 232 ";
> 		getSession().createSQLQuery(query).addEntity("d",Department.class)
> 		.addJoin("e","d.employees" )
> 		.list();
> 	}
> The testcase throws following exception,
> org.hibernate.QueryException: No column name found for property [id] for alias [e] [select * from ( select {d.*},{e.*}  from department d, employee e where d.department_id = e.department_id  ) where {e.id} = 232 ]
> 	at org.hibernate.loader.custom.sql.SQLQueryParser.resolveCollectionProperties(SQLQueryParser.java:152)
> 	at org.hibernate.loader.custom.sql.SQLQueryParser.substituteBrackets(SQLQueryParser.java:98)
> 	at org.hibernate.loader.custom.sql.SQLQueryParser.process(SQLQueryParser.java:51)
> 	at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:110)
> 	at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:47)
> 	at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:114)
> 	at org.hibernate.impl.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:137)
> 	at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
> 	at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
> 	at com.sony.spe.test.nativeSql.TestPageDAO.testNativeSqlQuery(TestPageDAO.java:117)
> 	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:585)
> 	at junit.framework.TestCase.runTest(TestCase.java:154)
> 	at junit.framework.TestCase.runBare(TestCase.java:127)
> 	at junit.framework.TestResult$1.protect(TestResult.java:106)
> 	at junit.framework.TestResult.runProtected(TestResult.java:124)
> 	at junit.framework.TestResult.run(TestResult.java:109)
> 	at junit.framework.TestCase.run(TestCase.java:118)
> 	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
> 	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> The following testcase runs fine if instead of {e.id} , we use {d.id} sine alias d is of type entity where as e here is a collection
> SQLQueryParser.java Line No:  148
> columnAliases = collectionPersister.getCollectionPropertyColumnAliases( propertyName, collectionSuffix );
> AbstractCollectionPersister.getCollectionPropertyColumnAliases()  uses a wrong Map (collectionPropertyColumnAliases) for looking up the property alias,  This method is the culprit.
> Fix:   Instead of calling getCollectionPropertyColumnAliases bypass and call resolveProperties which works fine
> //Existing Code
> //columnAliases = collectionPersister.getCollectionPropertyColumnAliases( propertyName, collectionSuffix );
> //Added: Viral
> columnAliases = new String[]{resolveProperties(aliasName, propertyName)};
> Now the test case wors fine and generates the alias :  EMPLOYEE1_0_1_  in the below query
> select
>         * 
>     from
>         ( select
>             d.DEPARTMENT_ID as DEPARTMENT1_1_0_,
>             d.DEPARTMENT_NAME as DEPARTMENT2_1_0_,
>             e.DEPARTMENT_ID as DEPARTMENT3_0__,
>             e.EMPLOYEE_ID as EMPLOYEE1_0__,
>             e.EMPLOYEE_ID as EMPLOYEE1_0_1_,
>             e.EMPLOYEE_NAME as EMPLOYEE2_0_1_  
>         from
>             department d,
>             employee e 
>         where
>             d.department_id = e.department_id  ) 
>     where
>         EMPLOYEE1_0_1_ = 232
> I have attached SQLQueryParser fixed and the test domain files I created for testing purpose

-- 
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