我有一个名为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
Person.java
public abstract class 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;
}
}
答案 0 :(得分:1)
实际上有一个未解决的问题:https://github.com/mongodb/morphia/issues/22
多态查询实际上可能会非常复杂,无法正确执行。实际上,他们让我有点紧张。也就是说,我正在与C#团队交谈,他们有一种似乎对他们有用的方法,没有太多的胃灼热,所以可能有一些灵感可以借用。但是,现在,您必须手动包含上面建议的className字段。
答案 1 :(得分: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());
}}