N+1 select with entities that contain Maps (even with FetchType.EAGER)
----------------------------------------------------------------------

                 Key: OPENJPA-1920
                 URL: https://issues.apache.org/jira/browse/OPENJPA-1920
             Project: OpenJPA
          Issue Type: Improvement
          Components: kernel
    Affects Versions: 2.0.0
            Reporter: Vermeulen


When I have an entity that contains a Map, e.g.:

@Entity
public class TestEntity {
        @ElementCollection(fetch = FetchType.EAGER)
        Map<String, String> strings = new HashMap<String, String>();
}

And I select all existing entities
                String query = "SELECT z FROM " + 
TestEntity.class.getSimpleName()
                                + " z";
                List<TestEntity> result = em.createQuery(query, 
TestEntity.class)
                                .getResultList();

n + 1 selects are performed which can be seen by using <property 
name="openjpa.Log" value="DefaultLevel=TRACE" />

917  testPU  TRACE  [main] openjpa.Query - Executing query: SELECT z FROM 
TestEntity z
918  testPU  TRACE  [main] openjpa.jdbc.SQL - <t 4837279, conn 6040101> 
executing prepstmnt 17507279 SELECT t0.id, t0.name FROM TestEntity t0
918  testPU  TRACE  [main] openjpa.jdbc.SQL - <t 4837279, conn 6040101> [0 ms] 
spent
919  testPU  TRACE  [main] openjpa.jdbc.SQLDiag - load field: 'strings' for 
oid=entities.TestEntity-1 class entities.TestEntity
919  testPU  TRACE  [main] openjpa.jdbc.SQL - <t 4837279, conn 6040101> 
executing prepstmnt 7493991 SELECT t0.KEY0, t0.value FROM TestEntity_strings t0 
WHERE t0.TESTENTITY_ID = ? [params=(long) 1]
919  testPU  TRACE  [main] openjpa.jdbc.SQL - <t 4837279, conn 6040101> [0 ms] 
spent
920  testPU  TRACE  [main] openjpa.jdbc.SQLDiag - load field: 'strings' for 
oid=entities.TestEntity-51 class entities.TestEntity
920  testPU  TRACE  [main] openjpa.jdbc.SQL - <t 4837279, conn 6040101> 
executing prepstmnt 7200207 SELECT t0.KEY0, t0.value FROM TestEntity_strings t0 
WHERE t0.TESTENTITY_ID = ? [params=(long) 51]

etc.....

It doesn't matter whether or not I use <property 
name="openjpa.jdbc.EagerFetchMode" value="parallel"/> or <property 
name="openjpa.jdbc.EagerFetchMode" value="join"/>.

This is extremely inefficient when I wish to load a list of products that have 
their name set in multiple languages by using a Map from language to String.
As a workaround I can turn the Map into a List and search the List myself for 
the right entry.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to