2

Person という名前の抽象 POJO クラスと、Developer と Manager という名前の 2 つのエンティティがあります。これらのエンティティは 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

私の質問は、複数のエンティティを持つコレクション内の特定のエンティティ リストを 1 つだけ取得するにはどうすればよいかということです。

私のPOJO

Person.java

パブリック抽象クラス Person {

@Id
private ObjectId objectid;
private String username;

public Person() {
}

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

People.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;
    }
}
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 に答える