当我有一个包含Map的实体时,例如
@Entity
public class TestEntity {
@ElementCollection(fetch = FetchType.EAGER)
Map<String, String> strings = new HashMap<String, String>();
}
我选择多个实体(SELECT z FROM TestEntity z),OpenJPA 2.0为每个TestEntity执行一个查询以获取地图,即使我使用了FetchType.EAGER。当Map值是一个实体并且我使用@OneToMany而不是@ElementCollection时,也会发生这种情况。原则上,这可以通过一个查询来更有效地完成,该查询为所有返回的TestEntities选择所有映射条目。对于集合值字段,OpenJPA默认情况下已经执行此操作(openjpa.jdbc.EagerFetchMode“value =”parallel“),但它似乎在这个简单实体上失败。(与value =”join“相同的问题)。
我可能做错了吗?有没有一种简单的方法可以告诉OpenJPA不对每个实体执行查询但只执行一个查询? 或者是否已经计划改进这项工作(我在https://issues.apache.org/jira/browse/OPENJPA-1920下提交了文件)?
对我们来说这是一个问题,因为我们希望获取(和分离)大约1900种产品的列表,这些产品使用OpenJPA需要将近15秒。使用我自己的原生查询只需不到一秒钟。
只需编写一个本机查询就不会有太大的问题,但我们使用的地图是在一个可重用的StringI18N实体中,该实体是从几个不同的实体引用的(并且可以在对象图中很深),因此本机查询是一个维持头痛。 非常感谢任何提高表现的帮助。
编辑:显式使用JOIN FETCH也无济于事: “SELECT z FROM TestEntity z JOIN FETCH z.strings” OpenJPA的TRACE仍显示它为每个TestEntity执行一个SQL语句。
答案 0 :(得分:0)
这可能是一种痛苦(纠正:我知道这将是一种痛苦)但你是否尝试将你的2场TestEntity
映射为完整的JPA-persisted {{ 1}}?
我知道Hibernate过去常常以@Entity
来区别对待@ElementCollection
- OpenJPA可能会做类似的事情。