我们说我有一个包含
的模型M1.java
@BelongsTo(foreignKeyName = "m2_id", parent = M2.class)
然后在加载M1后我做了
M2 myM2 = myM1.parent(M2.class)
我想一个额外的查询来获取M2对象(类似于Hibernate FetchType.LAZY),我们如何在第一个查询(加载M1对象)上强制JOIN?
如果不可能,或者我不想在某些情况下加入,那么每次调用parent(M2.class)
都会重新运行查询以加载M2,或者是在第一个" fetch"之后缓存在M1对象中?
感谢。
修改
我发现此页面http://javalite.io/lazy_and_eager解释了父母不会被缓存,除非我使用include()
方法。
问题是当我使用它时,我在日志中看到查询选择具有一个查询的父项但是我仍然看到额外的查询再次逐个加载它们!所以它不是O(2)而不是O(n + 1),而是O(n + 2)!
...
// Both test tables contain 1 row
List<M1> myM1s = M1.where(query, params).include(M2.class);
...
// Duplicating 3 times the print statement for test purpose
System.out.println(myM1s.get(0).parent(M2.class));
System.out.println(myM1s.get(0).parent(M2.class));
System.out.println(myM1s.get(0).parent(M2.class));
...
日志
Query: "SELECT * FROM m1 WHERE...", with parameters:...
Query: "SELECT * FROM m2 WHERE id IN (1)"
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
发生了什么事?
答案 0 :(得分:0)
我无法复制你的经历。以下测试与您的代码相同:https://github.com/javalite/activejdbc/blob/master/activejdbc/src/test/java/org/javalite/activejdbc/IncludesTest.java#L32
第38行检查两个引用是否指向同一个确切的对象。此外,测试打印出这个:
[main] INFO org.javalite.activejdbc.LazyList - Query: "SELECT * FROM addresses WHERE city = ? ORDER BY id", with parameters: <Springfield>, took: 11 milliseconds
[main] INFO org.javalite.activejdbc.LazyList - Query: "SELECT * FROM users WHERE id IN (?, ?)", with parameters: <1>, <2>, took: 9 milliseconds
如您所见,框架按预期工作。您可以克隆源并在您的环境中运行以验证这一点。
您的环境肯定有问题吗?