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

Michael Wyraz (JIRA) noreply at atlassian.com
Fri Nov 27 09:43:10 EST 2009


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.3.2, 3.2.7
            Reporter: Michael Wyraz


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