[hibernate-issues] [Hibernate-JIRA] Closed: (HHH-4615) index() not working with maps and map-key-many-to-many

Steve Ebersole (JIRA) noreply at atlassian.com
Wed Feb 3 16:36:29 EST 2010


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4615?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Steve Ebersole closed HHH-4615.
-------------------------------

    Resolution: Duplicate

Most of this is fixed by HHH-4879.  

The only part that is not is the ability to dereference the index() call.  For example, "... where index(b).somePropertyOfB = ?" is not supported.

> index() not working with maps and map-key-many-to-many
> ------------------------------------------------------
>
>                 Key: HHH-4615
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4615
>             Project: Hibernate Core
>          Issue Type: Bug
>    Affects Versions: 3.2.7, 3.3.2
>            Reporter: Michael Wyraz
>         Attachments: test-hibernate-1.0.0-SNAPSHOT-project.zip
>
>
> I have 2 mapped entities:
> EntityA [ id:long, testMap:Map<EnityB,Integer>, some other properties ]
> EntityB [ id:long, some other properties ]
> The mapping of EntityA is like:
> <class name="EntityA">
>   <id name="id">...</id>
>   <map name="testMap" table="a_to_b">
>     <key column="a_id"/>
>     <map-key-many-to-many column="b_id" class="EntityB"/>
>     <element type="integer" column="int_value"/>
>   </map>
> </class>
> Now I want to query all EntityA with a certain EnityB as map key:
> 1.
>   "from a EntityA left join a.testMap b where index(b).id=?"
>   Parameter: <Long> (id of an EntityB)
> 15:35:12,349 ERROR PARSER:56 - <AST>:1:94: unexpected AST node: (
> java.lang.NullPointerException
> 	at org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:534)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4543)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1289)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3722)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1864)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1792)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:818)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:604)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
> 	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
> 	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
> 	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
> 	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
> 	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
> 	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
> 	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
> 	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
> 	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
> 	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
> [...]
> 2.
>   "from a EntityA left join a.testMap b where index(b)=?"
>   Parameter: <Long> (id of an EntityB)
> This is really strange: it tries to run the getter of EnityB.id againt a <Long>
> org.hibernate.PropertyAccessException: could not get a field value by reflection getter of test.EntityB.id
> 	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:58)
> 	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:199)
> 	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3605)
> [...]
> Caused by: java.lang.IllegalArgumentException: Can not set long field test.EntityB.id to java.lang.Long
> 	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
> 	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
> 	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
> 	at sun.reflect.UnsafeLongFieldAccessorImpl.getLong(UnsafeLongFieldAccessorImpl.java:42)
> 	at sun.reflect.UnsafeLongFieldAccessorImpl.get(UnsafeLongFieldAccessorImpl.java:18)
> 	at java.lang.reflect.Field.get(Field.java:358)
> 	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:55)
> 	... 67 more
> 3.
>   "from a EntityA left join a.testMap b where index(b)=?"
>   Parameter: <EntityB>
> 15:40:24,935  INFO IntegerType:158 - could not bind value '2009219112005957163' to parameter: 1; java.lang.Long cannot be cast to java.lang.Integer
> java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
> 	at org.hibernate.type.IntegerType.set(IntegerType.java:64)
> 	at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:154)
> 	at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
> 	at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:68)
> 	at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:514)
> 	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1593)
> Here it thinks that the index() is of type integer.

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