Java Morphia 2.0.0-RC1查询在保存对象后返回空列表

Java Morphia 2.0.0-RC1查询在保存对象后返回空列表,java,mongodb,morphia,Java,Mongodb,Morphia,我正试图让Morphia与mongoDB一起工作,并且能够将我的对象保存到数据库中。但是当我试图检索所有对象时,我得到一个空列表 我使用的是mongo db java驱动程序3.12.0和morphia 2.0.0-rc1。旧的execute方法自2.0以来已被弃用,但《参考指南》尚未更新。我查看了github上的代码,现在看来直接调用迭代器而不是使用execute是正确的方法 更新:只需添加任何过滤器,我就能得到结果吗 public class MongoDBConnectorTest { @

我正试图让Morphia与mongoDB一起工作,并且能够将我的对象保存到数据库中。但是当我试图检索所有对象时,我得到一个空列表

我使用的是mongo db java驱动程序3.12.0和morphia 2.0.0-rc1。旧的execute方法自2.0以来已被弃用,但《参考指南》尚未更新。我查看了github上的代码,现在看来直接调用迭代器而不是使用execute是正确的方法

更新:只需添加任何过滤器,我就能得到结果吗

public class MongoDBConnectorTest {
@Test
public void test() {
    //MongoDatabase db = MongoDBConnector.getClient().getDatabase("lottoDB");
    //MongoCollection<Lotto> lottoCollection = db.getCollection("lotto", Lotto.class);

    Datastore lottoDatastore = LottoDataStore.getLottoDataStore().getDataStore();

    //System.out.println(db.getName());

    final Lotto lotto = new Lotto();
    lotto.setHighestPriceMoney(100000);

    // Insert lotto object
    //lottoCollection.insertOne(lotto);
    lottoDatastore.save(lotto);

    // Find it again
    //final Query<Lotto> query = lottoDatastore.find(Lotto.class);
    //List<Lotto> lottos = (List<Lotto>) query.iterator().toList();
    final Query<Lotto> query = lottoDatastore.find(Lotto.class);
    final List<Lotto> lottos = query.iterator().toList();
    final Lotto lotto2 = query.first();
    //Lotto lotto2 = query.first();

    System.out.println("Lotto found:");
    System.out.println(lottos.size());
    System.out.println(lotto2);

}
}
}

java

@Entity("lotto")
public class Lotto {
@Id
protected String alias = "lotto";

@BsonProperty(value = "highest_price_money")
protected int highestPriceMoney;

@BsonProperty(value = "average_price_money")
protected int averagePriceMoney;

@BsonProperty(value = "min_cost")
protected int minCost;

@BsonProperty(value = "min_cost_highest_price_money")
protected int minCostHighestPriceMoney;

List<LottoResult> results;

public Lotto() {

}

public String getAlias() {
    return alias;
}



public void setAlias(String alias) {
    this.alias = alias;
}



public int getHighestPriceMoney() {
    return highestPriceMoney;
}



public void setHighestPriceMoney(int highestPriceMoney) {
    this.highestPriceMoney = highestPriceMoney;
}



public int getAveragePriceMoney() {
    return averagePriceMoney;
}



public void setAveragePriceMoney(int averagePriceMoney) {
    this.averagePriceMoney = averagePriceMoney;
}



public int getMinCost() {
    return minCost;
}



public void setMinCost(int minCost) {
    this.minCost = minCost;
}



public int getMinCostHighestPriceMoney() {
    return minCostHighestPriceMoney;
}



public void setMinCostHighestPriceMoney(int minCostHighestPriceMoney) {
    this.minCostHighestPriceMoney = minCostHighestPriceMoney;
}



public List<LottoResult> getResults() {
    return results;
}



public void setResults(List<LottoResult> results) {
    this.results = results;
}



@Override
public String toString() {
    return "Lotto [id=" + alias + ", highestPriceMoney=" + highestPriceMoney + ", minCost=" + minCost
            + ", minCostHighestPriceMoney=" + minCostHighestPriceMoney + ", results=" + results + "]";
}


}
@实体(“乐透”)
公共类彩票{
@身份证
受保护字符串别名=“乐透”;
@BsonProperty(value=“最高价格”
最高价的钱;
@BsonProperty(value=“平均价格\货币”)
受保护的国际平均价格;
@BsonProperty(value=“最小成本”)
保护成本;
@BsonProperty(value=“最低成本\最高价格\货币”)
保护最低成本最高价格的货币;
列出结果;
公共乐透{
}
公共字符串getAlias(){
返回别名;
}
public void setAlias(字符串别名){
this.alias=别名;
}
public int getHighestPriceMoney(){
归还最高价的钱;
}
公共无效setHighestPriceMoney(int highestPriceMoney){
high.highestPriceMoney=highestPriceMoney;
}
public int getAveragePriceMoney(){
返回平均价格货币;
}
公共无效setAveragePriceMoney(int averagePriceMoney){
this.averagePriceMoney=averagePriceMoney;
}
public int getMinCost(){
退货成本;
}
公共void setMinCost(int minCost){
this.minCost=minCost;
}
public int getMinCostHighestPriceMoney(){
返还最低成本最高价格的金钱;
}
public void setMinCostHighestPriceMoney(int minCostHighestPriceMoney){
this.minCostHighestPriceMoney=minCostHighestPriceMoney;
}
公共列表getResults(){
返回结果;
}
公共void setResults(列出结果){
这个结果=结果;
}
@凌驾
公共字符串toString(){
return“Lotto[id=“+alias+”,highestPriceMoney=“+highestPriceMoney+”,minCost=“+minCost
+“,minCostHighestPriceMoney=“+minCostHighestPriceMoney+”,results=“+results+””;
}
}

这适用于我使用和2.0.0-RC1。我不完全确定当地发生了什么,你没有看到结果。不过,代码中有一些奇怪之处。代码中有许多驱动程序注释。就目前而言,这很好,但Morphia不使用这些注释


您映射的包可能与
Lotto
所在的位置不匹配,但在这种情况下,我预计会出现一个关于缺少
编解码器的错误。

首先,感谢您与Morphia合作,非常感谢!你对编解码器有什么建议吗?如果我在查询中添加一个过滤器,即final query query=lottoDatastore.find(Lotto.class);query.filter(Filters.exists(“别名”);最终列表lottos=query.iterator().toList();我发现了一个问题——当我注册MongoClient时,我添加了PojoCoded。如果没有这个编解码器,它就可以工作。太棒了,谢谢你!Morphia将使用正确的编解码器提供程序配置mongo客户端,以查找它为您的实体构建的编解码器。如果您手动添加了
PojoCodec
,那么注册表很可能会发现它,而您正在另一个集合中保存您的实体。我猜如果你在
Lotto
收藏中查找,而不是
Lotto
morphia正在查找的地方,你会找到丢失的文档。
@Entity("lotto")
public class Lotto {
@Id
protected String alias = "lotto";

@BsonProperty(value = "highest_price_money")
protected int highestPriceMoney;

@BsonProperty(value = "average_price_money")
protected int averagePriceMoney;

@BsonProperty(value = "min_cost")
protected int minCost;

@BsonProperty(value = "min_cost_highest_price_money")
protected int minCostHighestPriceMoney;

List<LottoResult> results;

public Lotto() {

}

public String getAlias() {
    return alias;
}



public void setAlias(String alias) {
    this.alias = alias;
}



public int getHighestPriceMoney() {
    return highestPriceMoney;
}



public void setHighestPriceMoney(int highestPriceMoney) {
    this.highestPriceMoney = highestPriceMoney;
}



public int getAveragePriceMoney() {
    return averagePriceMoney;
}



public void setAveragePriceMoney(int averagePriceMoney) {
    this.averagePriceMoney = averagePriceMoney;
}



public int getMinCost() {
    return minCost;
}



public void setMinCost(int minCost) {
    this.minCost = minCost;
}



public int getMinCostHighestPriceMoney() {
    return minCostHighestPriceMoney;
}



public void setMinCostHighestPriceMoney(int minCostHighestPriceMoney) {
    this.minCostHighestPriceMoney = minCostHighestPriceMoney;
}



public List<LottoResult> getResults() {
    return results;
}



public void setResults(List<LottoResult> results) {
    this.results = results;
}



@Override
public String toString() {
    return "Lotto [id=" + alias + ", highestPriceMoney=" + highestPriceMoney + ", minCost=" + minCost
            + ", minCostHighestPriceMoney=" + minCostHighestPriceMoney + ", results=" + results + "]";
}


}