我正在使用 Spring-data 通过 REST 访问 Neo4j 数据库。
我的一个实体与以下实体类似:
@NodeEntity
@TypeAlias("org.example.Foo")
public class Foo {
@GraphId
private Long nodeId;
//...
@RelatedTo(type="HAS_BAR", direction=Direction.OUTGOING)
private Set<Bar> bars;
//...
}
典型的 Foo
可能有 0-1000 个 Bar
。大多数时候,加载 Foo
时不需要这些 Bar
,所以我认为我应该不添加 @Fetch
注释,从而避免急切加载 Bar
。
但是,当现在使用生成的存储库方法加载 Foo
时,Bar
会被加载 - 至少部分加载(仅加载其 nodeId 属性)。
有什么办法可以避免这种情况吗?这种行为会严重影响性能。
我真的希望能够使用延迟加载,如https://stackoverflow.com/a/16159051/232175所示对于集合本身。
最佳答案
为了使延迟获取发挥作用,Spring Data 为所有 Bar 创建一个代理,并提供足够的信息(节点 ID),以便在需要时用于延迟获取 Bar。这就是在您的案例中创建 Bar
的原因。我建议您使用 Neo4jTemplate
只提取您正在查找的 Foo 属性,如下所示
Result<Map<String, Object>> result = template.query("START n=node({0}) RETURN n.property1, n.property2, n.property3");
result.handle(new Handler<Map<String, Object>>()
{
@Override
public void handle(Map<String, Object> row)
{
System.err.println(row.get("n.property1"));
System.err.println(row.get("n.property2"));
System.err.println(row.get("n.property3"));
}
});
关于java - 避免隐式急切加载集合 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18435948/