首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同一个集合中找到不同的实体

如何在同一个集合中找到不同的实体
EN

Stack Overflow用户
提问于 2013-09-27 10:06:04
回答 2查看 2.5K关注 0票数 2

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

代码语言:javascript
复制
 Morphia morphia = new Morphia();
 Datastore ds = morphia.createDatastore("test");
 for (Developer savedDeveloper : ds.find(Developer.class).asList()) {
      System.out.println(savedDeveloper.getFoo());
 }

异常

代码语言:javascript
复制
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

Person.java

公共抽象类人{ @Id私有ObjectId objectid;私有字符串用户名;public Person() {} /* ......Getters和Setters*/ }

People.java

代码语言:javascript
复制
@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;
    }
}

Manager.java

代码语言:javascript
复制
    @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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-01 12:39:09

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

代码语言:javascript
复制
public class DeveloperDAO extends BasicDAO<Developer, String> {

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

测试

代码语言:javascript
复制
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());
}}
票数 1
EN

Stack Overflow用户

发布于 2013-10-02 15:57:31

实际上,这方面还有一个悬而未决的问题:https://github.com/mongodb/morphia/issues/22

多态查询实际上会变得非常复杂,很难在一般情况下正确地执行。事实上,他们让我有点紧张。话虽如此,我还是在和C#团队交谈,他们有一种方法似乎对他们有效,没有太多的心痛,所以可能会有一些灵感值得借鉴。不过,现在您必须按照上面的建议手动包含className字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19048086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档