Hi all,
My Entity (TestEntity) has one embedded attribute(eAttr) which contains a Map attribute (sample). It is annotated with ElementCollection.
@ElementCollection
@CollectionTable(name = "TABLE_1",
joinColumns = @JoinColumn(name = "PARENT_ID"))
@MapKeyColumn(name = "C1")
@Column(name = "C2")
private Map<String, String> sample = new HashMap<String, String>();
You can find the details of the queries and the exceptions below. I justw anted to check if you have any experience on querying the embedded Map attributes.
I am trying to query on my “sample” attribute where C1 equals “xxxx” and C2 equals “yyyy”. I have first tried with JQPL like this
Query qry = odb_em.createQuery("select a from TestEntity a join a.eAttr.sample n where KEY(n) = :param1 and VALUE(n)= :param2");
qry.setParameter(“param1”, “xxxx”);
qry.setParameter(“param2”, “yyyy”);
List l = qry.getResultList();
System.out.println("Query Size:::" + l.size());
But I received this error
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-6070] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.QueryException
Exception Description: Invalid use of a query key [org.eclipse.persistence.mappings.DirectMapMapping[sample]] representing a "to-many" relationship in an _expression_. Use anyOf() rather than get().
at org.eclipse.persistence.exceptions.QueryException.invalidUseOfToManyQueryKeyInExpression(QueryException.java:735)
at org.eclipse.persistence.internal.expressions.QueryKeyExpression.validateNode(QueryKeyExpression.java:887)
at org.eclipse.persistence.expressions._expression_.normalize(_expression_.java:3009)
at org.eclipse.persistence.internal.expressions.DataExpression.normalize(DataExpression.java:342)
at org.eclipse.persistence.internal.expressions.QueryKeyExpression.normalize(QueryKeyExpression.java:612)
at org.eclipse.persistence.internal.expressions.QueryKeyExpression.normalize(QueryKeyExpression.java:599)
at org.eclipse.persistence.internal.expressions.DataExpression.normalize(DataExpression.java:336)
at org.eclipse.persistence.internal.expressions.QueryKeyExpression.normalize(QueryKeyExpression.java:612)
at org.eclipse.persistence.internal.expressions.QueryKeyExpression.normalize(QueryKeyExpression.java:599)
at org.eclipse.persistence.internal.expressions.CompoundExpression.normalize(CompoundExpression.java:218)
at org.eclipse.persistence.internal.expressions.RelationExpression.normalize(RelationExpression.java:476)
at org.eclipse.persistence.internal.expressions.CompoundExpression.normalize(CompoundExpression.java:218)
at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1300)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:491)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1553)
at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:678)
at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:625)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:509)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:820)
at org.eclipse.persistence.queries.DatabaseQuery.prepareCall(DatabaseQuery.java:1588)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:266)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:182)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:134)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:118)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1373)
at com.ciena.test.TestJpa.main(TestJpa.java:341)
Then I tried ExpressionBuilder and received the following exception
//Eclipse specific classes - getting JpaEntityManager
JpaEntityManager eclipseLink_em = JpaHelper.getEntityManager(em);
ExpressionBuilder expBuilder = new ExpressionBuilder();
_expression_ ex = expBuilder.anyOf("eAttr.sample").mapKey().equal("xxxx");
Query qry1 = eclipseLink_em.createQuery(ex.and(expBuilder.anyOf("eAttr.sample").equal("yyyy")), TestEntity.class);
List l = qry1.getResultList();
System.out.println("Query Size with EB:::" + l.size() + " Value ::" + l.toString());
em.close();
Exception [EclipseLink-6159] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.QueryException
Exception Description: Cannot find mapping for MapEntryExpression with base: [
Query Key eAttr.sample
Base com.test.TestEntity].
Query: ReadAllQuery(referenceClass=TestEntity )
at org.eclipse.persistence.exceptions.QueryException.noMappingForMapEntryExpression(QueryException.java:1456)
at org.eclipse.persistence.internal.expressions.MapEntryExpression.getInterfaceContainerPolicy(MapEntryExpression.java:251)
at org.eclipse.persistence.internal.expressions.MapEntryExpression.isAttribute(MapEntryExpression.java:233)
at org.eclipse.persistence.internal.expressions.RelationExpression.isObjectComparison(RelationExpression.java:449)
at org.eclipse.persistence.internal.expressions.RelationExpression.normalize(RelationExpression.java:475)
at org.eclipse.persistence.internal.expressions.CompoundExpression.normalize(CompoundExpression.java:218)
at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1300)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:491)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1553)
at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:678)
at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:625)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:509)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:820)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:470)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:710)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1036)
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:380)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1122)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2908)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1291)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1273)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1247)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:479)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:714)
at com.ciena.test.TestJpa.main(TestJpa.java:354)
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-6159] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.QueryException
Exception Description: Cannot find mapping for MapEntryExpression with base: [
Query Key eAttr.sample
Base com.test.TestEntity].
Query: ReadAllQuery(referenceClass=TestEntity)
at org.eclipse.persistence.exceptions.QueryException.noMappingForMapEntryExpression(QueryException.java:1456)
at org.eclipse.persistence.internal.expressions.MapEntryExpression.getInterfaceContainerPolicy(MapEntryExpression.java:251)
at org.eclipse.persistence.internal.expressions.MapEntryExpression.isAttribute(MapEntryExpression.java:233)
at org.eclipse.persistence.internal.expressions.RelationExpression.isObjectComparison(RelationExpression.java:449)
at org.eclipse.persistence.internal.expressions.RelationExpression.normalize(RelationExpression.java:475)
at org.eclipse.persistence.internal.expressions.CompoundExpression.normalize(CompoundExpression.java:218)
at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1300)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:491)
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1553)
at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:678)
at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:625)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:509)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:820)
at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:470)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:710)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1036)
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:380)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1122)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2908)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1291)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1273)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1247)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:479)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:714)
at com.ciena.test.TestJpa.main(TestJpa.java:354)