如何遍历2单向Ebean rels @ManyToOne和@OneToOne

时间:2012-10-20 18:14:23

标签: java playframework-2.0 ebean

这里找不到答案。我有3个对象(仅显示相关部分):

@Entity 
class Module {
} 

@Entity
class FeaturedModule {
    @OneToOne(optional = false)
    public Module playModule;

    public static final Finder<Long, FeaturedModule> FIND = new Finder<Long, FeaturedModule>(Long.class, FeaturedModule.class);
}

@Entity
class ModuleVersion {
    @ManyToOne
    public Module playModule

    public static final Finder<Long, ModuleVersion> FIND = new Finder<Long, ModuleVersion>(Long.class, ModuleVersion.class);
}

rels是单向的,也就是说,Module没有引用其他2个实体。

问题:

  1. 如何查找(来自ModuleVersion)不属于具有FeaturedModules的rel的模块
  2. 如何(使用FeaturedModules)查找具有给定ModuleVersion的一系列FeaturedModule

1 个答案:

答案 0 :(得分:1)

非常一般:最好为Module模型添加一个布尔标志,多亏了这个,你不需要编写复杂的查询来查找包含关系的模块,你可以只检查标志:

public static List<Module> findAllFeatured() {
    return find.select("id,name").where().eq("isFeatured", true).findList();
}

public static List<Module> findAllNotFeatured() {
    // give here list of field to select WITHOUT featured, otherwise it will 
    // create a JOIN to featured which will result that you will be not able
    // to get records without associations
    return find.select("id, name").where().eq("isFeatured", false).findList();
} 

使用isFeatured标记,您可以轻松过滤ModuleVersion

public static List<ModuleVersion> findAll(String version) {
    return find.fetch("module").where().like("version", version).findList();
}

public static List<ModuleVersion> findFeatured(String version) {
    return find.fetch("module")
            .where().like("version", version).eq("module.isFeatured", true).findList();
}

public static List<ModuleVersion> findNotFeatured(String version) {
    return find.fetch("module")
            .where().like("version", version).eq("module.isFeatured", false).findList();
}

当然,对于“自动”设置标记,您应该覆盖save()模型中的update(Object o)Module方法,如果您需要样本,请告诉我。