Как найти разные сущности в одной коллекции с помощью Morphia

У меня есть абстрактный класс POJO с именем Person и две сущности с именами Developer и Manager. Эти сущности наследуют абстрактный класс Person. Нет проблем с сохранением их в той же коллекции, но когда я пытаюсь найти, например, только разработчиков в коллекции, метод поиска Morphia получает все записи в коллекции, и я получаю исключение 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

Person.java

общественный абстрактный класс Person {

@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;
    }
}

Manager.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;
    }
}

person molgun    schedule 27.09.2013    source источник
comment
Пожалуйста, попробуйте: ds.find(Developer.class).filter("className",Developer.class.getName());   -  person Ori Dar    schedule 29.09.2013


Ответы (2)


На самом деле есть открытая проблема: https://github.com/mongodb/morphia/issues/22

Полиморфные запросы на самом деле могут быть довольно сложными для правильного выполнения в общем случае. На самом деле они заставляют меня немного нервничать. Тем не менее, я разговаривал с командой С#, и у них есть подход, который, кажется, работает для них без особой изжоги, поэтому, вероятно, там есть вдохновение, которое можно позаимствовать. Однако на данный момент вам придется вручную включить поле className, как было предложено выше.

person evanchooly    schedule 02.10.2013

Я решил эту проблему с помощью BasicDAO от Morphia. Я создал класс DeveloperDAO, который наследует класс Morphia BasicDAO, затем я использовал методы 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());
}}
person molgun    schedule 01.11.2013