[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4615?page=c...
]
Michael Wyraz updated HHH-4615:
-------------------------------
Attachment: test-hibernate-1.0.0-SNAPSHOT-project.zip
Attached a simple test. Please execute test.TestGetByMapKey.
While I could reproduce Case 1 and 2, the 3rd was not reproducable in my test application.
Since I changed my application (now I use a dedicated entity instead of the
Map<Entity,Integer> which allows much more efficient queries) I have no way to
reproduce it anymore. I tried a similar case within my application that worked fine. So I
guess, in the last one I made some mistake. In the result I would recommend to reduce the
priority of this issue.
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....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira