2

我有一个名为 Person 的抽象 POJO 类和两个名为 Developer 和 Manager 的实体。这些实体继承了 Person 抽象类。将它们保存到同一个集合中没有问题,但是当我尝试查找,例如,只有集合中的开发人员时,Morphia 的 find 方法获取了集合中的所有记录,我得到了 java.lang.ClassCastException。

 Morphia morphia = new Morphia();
 Datastore ds = morphia.createDatastore("test");
 for (Developer savedDeveloper : ds.find(Developer.class).asList()) {
      System.out.println(savedDeveloper.getFoo());
 }

例外

Sep 27, 2013 11:56:18 AM com.google.code.morphia.logging.MorphiaLoggerFactory chooseLoggerFactory
INFO: LoggerImplFactory set to com.google.code.morphia.logging.jdk.JDKLoggerFactory
Developer1
Developer2
Exception in thread "main" java.lang.ClassCastException: test.model.Manager cannot be cast to test.model.Developer
    at test.Test.main(Test.java:39)
Java Result: 1

所以我的问题是,如何才能在包含多个实体的集合中仅获取一个特定实体列表?

我的 POJO

人.java

公共抽象类人{

@Id
private ObjectId objectid;
private String username;

public Person() {
}

/* ......Getters and Setters*/ }

人.java

@Entity("people")
public class Developer extends Person {

    private String foo;

    public Developer() {
    }

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }
}

管理器.java

    @Entity("people")
    public class Manager extends Person {

    private String bar;

    public Developer() {
    }

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }
}
4

2 回答 2

1

我用 Morphia 的 BasicDAO 解决了这个问题。我创建了一个继承 Morphia 的 BasicDAO 类的 DeveloperDAO 类,然后我使用 DAO 方法进行查询并且它可以工作。

public class DeveloperDAO extends BasicDAO<Developer, String> {

public DeveloperDAO(String dbName) throws UnknownHostException {
    super(MongoSingleton.getInstance(), MorphiaSingleton.getInstance(), dbName);
} }

测试

public class Test {
public static void main(String[] args) throws UnknownHostException {
    DeveloperDAO developerDAO = new DeveloperDAO("test");
    for(Developer developer : developerDAO.find().asList())
        System.out.println(developer.getFoo());
}}
于 2013-11-01T12:39:09.377 回答
1

实际上有一个未解决的问题: https ://github.com/mongodb/morphia/issues/22

多态查询实际上可能会变得非常复杂,以一般地正确执行。实际上,它们让我有点紧张。也就是说,我正在与 C# 团队交谈,他们有一种方法似乎对他们有用,而且没有太多的胃灼热,所以可能有一些灵感可以借鉴。不过,现在,您必须按照上面的建议手动包含 className 字段。

于 2013-10-02T15:57:31.640 回答