当前位置: 首页 > 知识库问答 >
问题:

播放Morphia,无法获取(一般)嵌入对象的列表内容

湛财
2023-03-14

我正在使用Play Framework 1.2.5和Morphia-1.2.9a模块。我最初在我的模型上使用@reference注释,但由于(lazy=true)不能在@reference上工作,我需要使用ObjectID进行切换。为了减少返工和冗余,我创建了以下睡眠者:

package models.morphia;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import models.Team;

import org.bson.types.ObjectId;

import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Transient;

import play.modules.morphia.Model;
@Embedded
public class MorphiaList<T extends MorphiaModel> implements Iterable<T>{
    @Embedded("ids") private List<ObjectId> modelIds;
    @Transient List<T> models;
    public void sort()
    {
        this.getAll();
        Collections.sort(models);
        this.modelIds.clear();
        for(T t:this.models){
            this.modelIds.add((ObjectId)t.getId());
        }
    }
    public MorphiaList()
    {
        this.models = new ArrayList<T>();
        this.modelIds = new ArrayList<ObjectId>();
    }
    public int size()
    {
        System.out.println(modelIds.size());
        return modelIds.size();
    }
    public boolean add(T model)
    {
        return (this.models.add(model) && this.modelIds.add((ObjectId) model.getId()));
    }
    public boolean remove(T model)
    {
        return (this.models.remove(model)&&this.modelIds.remove((ObjectId) model.getId()));
    }
    public boolean addAll(Collection<? extends T> models)
    {
        for(T model: models)
        {
            this.models.add(model);
            this.modelIds.add((ObjectId) model.getId());
        }
        return false;
    }
    public List<T> getAll()
    {
        for(ObjectId oi: this.modelIds)
        {
            boolean found=false;
            for(T model: models)
            {
                if(oi==model.getId())
                {
                    found=true;
                    break;
                }
            }
            if(!found)
                models.add(T.<T>findById(oi));
        }
        return models;
    }
    public T get(int index)
    {
        ObjectId id = modelIds.get(index);
        for(T model: models)
        {
            if(id == model.getId())
                return model;
        }
        return T.<T>findById(id);
    }
    @Override
    public Iterator<T> iterator() {
        return this.getModelIterator();
    }
    public Iterator<T> getModelIterator() {
        for(ObjectId oi: modelIds)
        {
            boolean found=false;
            for(T model: models)
            {
                if(oi==model.getId())
                {
                    found=true;
                    break;
                }
            }
            if(!found)
                models.add(T.<T>findById(oi));
        }
        return models.iterator();
    }
    public boolean isEmpty() {
        return this.modelIds.isEmpty();
    }
    public boolean contains(T t) {
        return this.modelIds.contains(t.getId());
    }
}

MorphiaModel很简单,我只需要它来实现可比,这样我就可以对列表进行排序:

package models.morphia;
import play.modules.morphia.Model;
public abstract class MorphiaModel<T extends MorphiaModel<T>> extends Model implements Comparable<T>{
}

然后我在课上这样用:

@Entity
public class Organization extends Purchasable { 
@Embedded public MorphiaList<Season> seasons = new MorphiaList<Season>();
{ 
 "_id" : { "$oid" : "50097c147aa33c43fa8136ee"} ,
 ...other members...
 "seasons" : { "ids" : [ { "$oid" : "50097c147aa33c43fa8136ed"}]} ,
 ...other members...
}

共有1个答案

王高邈
2023-03-14

我无法让它工作有多种原因:

  1. 我无法获取保存到mongoDB的数据以加载回对象,对象将始终为空。
  2. 在第1期之后,我添加了一个私人列表,可以在查找上填充我的睡眠者来绕过它。但在将ID输入MorphiaList后,我不知道如何查找特定的集合。特别是当您考虑到我使用继承时,所以我有一些异构集合。

我的解决方案:对于每一个引用列表,我都重写了以下内容:

@Reference public List<Season> seasons;
@Transient public List<Season> seasons;
private List<ObjectId> _seasons = new ArrayList();
@Transient private List<Season> pSeasons;
public List<Season> getSeasons()
{
    if(pSeasons==null)
    {
        if(_seasons.size()!=0)
            pSeasons = Season.find().<Season>field("_id").in(_seasons).asList();
        else
            pSeasons = new ArrayList();
    }
    return pSeasons;
}
@PrePersist void beforeSave()
{
    if(pSeasons!=null)
    {
        _seasons.clear();
        for(Season s: pSeasons)
        {
            _seasons.add((ObjectId)s.getId());
        }
    }
}
 类似资料:
  • 是否有其他人在创建播放列表后不能访问播放列表id?

  • 我是morphia的新手,想知道是否可以在文档中嵌入自定义对象列表,同时拥有自定义名称。 例如,

  • 所以我用javafx制作了一个mp3播放器,它有一个,在这里我拖放歌曲,然后选择一首歌曲并按play播放,你就明白了。问题是,用我当前的代码,我不能播放两首以上歌曲的序列:/(播放选定的歌曲,播放它旁边的歌曲,然后停止)。代码如下:

  • 我使用最新的freemarker版本2.3.23我有列表,其中包含用户对象,用户对象很简单,只包含名称属性。我的ftl文件如下所示: 我的Java代码如下所示: 错误显示如下:

  • 我是一个非常noob的用户,我正在尝试在我的Android应用程序中播放Spotify的一些曲目。目前我正在使用kaaes API:https://github.com/kaaes/spotify-web-api-android 我正在努力从一个非常特定的播放列表和一个非常特定的用户ID中检索曲目。似乎我做不到,我找到的例子都是老的,对我没有帮助。以下是我尝试过的: 从寻呼机对象访问播放列表 它会

  • 我没有找到任何关于这个特殊“问题”的答案。我目前使用Play framework 1.2.5和Play Morphia模块1.2.9 好了,问题来了:我有一个抽象类A(不是@Entity因为不允许)和两个继承自类A的类B和C,类A是从模型类扩展而来的。类B和C有@Entity注释。 你能帮帮我吗?(如果我用@entity(value=“xxxx”)在B和C上设置相同的集合,可能) 谢了!