查询未检索到嵌入式 JDO 字段

Posted

技术标签:

【中文标题】查询未检索到嵌入式 JDO 字段【英文标题】:Embedded JDO Field is not Retrieved by Query 【发布时间】:2012-05-16 15:37:10 【问题描述】:

我正在使用 App Engine 的 JDO 实现的本地开发版本。当我查询包含其他对象作为嵌入字段的对象时,嵌入字段返回为 null。

例如,假设这是我坚持的主要对象:

@PersistenceCapable
public class Branch 

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name;

    @Persistent
    private Address address;

            ...

这是我的嵌入对象:

@PersistenceCapable(embeddedOnly="true")
public class Address 

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String street;

    @Persistent
    private String city;

            ...

以下代码不检索嵌入对象:

    PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();

    Branch branch = null;
    try 
        branch = pm.getObjectById(Branch.class, branchId);
    
    catch (JDOObjectNotFoundException onfe) 
        // not found
    
    catch (Exception e) 
        // failed
    
    finally 
        pm.close();
    

有人对此有解决方案吗?如何检索 Branch 对象及其嵌入的 Address 字段?

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,发现默认提取组中不包含嵌入字段。要加载所需的字段,您要么必须在关闭持久性管理器之前为其调用 getter,要么将 fetch 组设置为加载所有字段。

这意味着以下...

branch = pm.getObjectById(Branch.class, branchId);
pm.close();
branch.getAddress();  // this is null

branch = pm.getObjectById(Branch.class, branchId);
branch.getAddress();  // this is not null
pm.close();
branch.getAddress();  // neither is this

因此,您需要按如下方式更改代码:

Branch branch = null;
try 
    branch = pm.getObjectById(Branch.class, branchId);
    branch.getAddress();

catch (JDOObjectNotFoundException onfe) 
    // not found

catch (Exception e) 
    // failed

finally 
    pm.close();

或者,您可以将提取组设置为包括所有字段,如下所示...

pm.getFetchPlan().setGroup(FetchGroup.ALL);
branch = pm.getObjectById(Branch.class, branchId);
pm.close();
branch.getAddress();  // this is not null

【讨论】:

感谢您的及时答复!我会对此进行测试,并让您知道它是否有效。 如果一个字段在活动提取组中,那么它显然应该被提取。如果您说不是,那为什么不提供一个简单的测试用例并在code.google.com/p/datanucleus-appengine/issues/list 报告它 不报告它可能意味着参与该项目的任何人都不会知道它 我不确定这是一个错误还是 JDO 规范的一部分。我记得在某处读到嵌入字段的延迟加载在 JDO 规范中,但我现在找不到。 任何字段都可以是惰性的或急切的,当标记为这样时。无论哪种方式,我之前的评论都是有效的

以上是关于查询未检索到嵌入式 JDO 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 中嵌入 UITableView 的文本字段中检索数据?

从嵌入式 RavenDB 中的索引检索结果时出现问题

如何在 Mongoose 的嵌入式文档中检索数组的最后一个对象?

如何在 Mongoose 的嵌入式文档中检索数组的最后一个对象?

使用 YAML 进行地理空间索引“未找到字段映射”

SQL多表链接查询、嵌入SELECT语句的子查询技术