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

如何使用Ebean查询具有一对一和多对一关系的表

苏鸿志
2023-03-14

我正在使用Play Framework 2.1.0和Ebean,在查询下列场景时遇到问题:

我有3类表示数据库中的表。

class project {
   ...
   @OneToMany
   public SubProject sub;   
}

class SubProject {
   ...
   @ManyToOne
   public Project project;

   @OneToMany 
   public MiniProject mini;    
}   

class MiniProject {
  ...
  @ManyToOne
  public SubProject sub;    
}

使用Ebean,如何

>

  • 是否检索项目列表中的所有子项目?

    是否检索项目的所有小型项目?

    给定子项目列表,如何检索所有小项目?

  • 共有3个答案

    赏星河
    2023-03-14

    在类中定义帮助器

    public static Finder<Long, YourClass> find = new Finder<Long, YourClass>(Long.class, YourClass.class);
    

    查询:

    SubProject.find.where().in("project", listOfProject)
    MiniProject.find.where().eq("sub.project",yourProject)
    MiniProject.find.where().in("sub", listOfSubProject)
    
    孟茂学
    2023-03-14

    假设实体是固定的,并且您实际上有一个列表

    检索项目列表中的所有子项目?

    select s from Project p inner join p.subProjects s where p.id in :projectIds
    

    是否检索项目的所有小型项目?

    select m from Project p 
    inner join p.subProjects s 
    inner join s.miniProjects m
    where p.id = :projectId
    

    给出子项目列表,说明如何检索所有小项目。

    与第一个查询相同:

    select m from SubProject s inner join s.miniProjects m where s.id in :subProjectIds
    

    龚联
    2023-03-14

    首先,你错误地定义了类。应该在元素列表上定义@OneTo多项注释。我纠正了这些映射,然后编写了检索所需查询的测试方法。下面是代码:

    项目类别:

    @Entity  
    public class Project {
    
        @Id
        public Long id;
    
       @OneToMany(mappedBy="project")
       public List<SubProject> subprojects;
    }
    

    子项目类别:

    @Entity 
    public class SubProject {
    
        @Id
        public Long id;
    
        @ManyToOne
        public Project project;
    
        @OneToMany(mappedBy="subproject") 
        public List<MiniProject> miniprojects; 
    } 
    

    小型项目类别:

    @Entity 
    public class MiniProject {
    
        @Id
        public Long id;
    
        @ManyToOne
        public SubProject subproject;
    }
    

    试验方法:

    @Test
    public void subTest () {
        FakeApplication app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
        Helpers.start(app);
    
        Project p1 = new Project();
        p1.id=1L;
    
        SubProject s1 = new SubProject();
        SubProject s2 = new SubProject();
        s1.id=1L;
        s2.id=2L;
    
        p1.subprojects.add(s1);
        p1.subprojects.add(s2);
        s1.project = p1;
        s2.project = p1;
    
        MiniProject m1 = new MiniProject();
        MiniProject m2 = new MiniProject();
        MiniProject m3 = new MiniProject();
        MiniProject m4 = new MiniProject();
    
        m1.id=1L;
        m2.id=2L;
        m3.id=3L;
        m4.id=4L;
    
        s1.miniprojects.add(m1);
        s1.miniprojects.add(m2);
        s2.miniprojects.add(m3);
        s2.miniprojects.add(m4);
    
        m1.subproject =s1;
        m2.subproject =s1;
        m3.subproject =s2;
        m4.subproject =s2;
    
        Ebean.save(p1);
        Ebean.save(s1);
        Ebean.save(s2); 
        Ebean.save(m1);
        Ebean.save(m2);
        Ebean.save(m3);
        Ebean.save(m4);
    
        // retrieve all the subprojects of a list of Projects
        List<Long> projectIds = new ArrayList<Long>();
        projectIds.add(1L);     
        List<SubProject> subList = Ebean.createQuery(SubProject.class).where(Expr.in("project.id", projectIds)).findList();
    
        // retrieve all the miniprojects of a Project 
        Long projectId = 1L;
        List<MiniProject> miniList = Ebean.createQuery(MiniProject.class).where(Expr.eq("subproject.project.id", projectId)).findList();
    
        // given a list of sub projects , how to retrieve all the miniprojects
        List<Long> subprojectIds = new ArrayList<Long>();
        subprojectIds.add(1L);      
        List<MiniProject> miniSubList = Ebean.createQuery(MiniProject.class).where(Expr.in("subproject.id", subprojectIds)).findList();
    
    
        for(SubProject sub: subList) {
            System.out.println("subproject: "+sub.id);
        }
        System.out.println("-----------");
        for(MiniProject mini: miniList) {
            System.out.println("miniproject: "+mini.id);
        }
        System.out.println("-----------");
        for(MiniProject mini: miniSubList) {
            System.out.println("miniproject: "+mini.id);
        }
    }
    
     类似资料:
    • 问题内容: 我将Ebean与Play 2 Framework结合使用,并得到了两种模型:用户模型和书本模型。用户模型与书籍模型以一对多关系连接。因此,每个用户可以拥有很多书,甚至根本没有书。书籍模型本身也具有属性。现在,我想在用户模型中创建一个查询,该查询仅返回具有某些属性书的用户。例如:一个属性可能是条件,例如new或used。现在,给我所有拥有新状态书籍的用户。是否可以使用Ebean方法创建这

    • 实现了一对多的关系,它运行良好。 我的问题是当我运行下面的查询时,如果表有100个员工行,每个员工有两个部门。数据库查询被调用了101次,因为对每个员工都是调用部门查询,要完成调用全部100行需要很长时间,有没有人可以提出替代的解决方案? 输出XML:

    • 我有一个桌子实验和一个桌子标签。一个实验可能有许多标签。架构: 是否可以使用返回实验和相应标签列表的jooq创建查询? 类似

    • 我正在努力理解如何处理与JOOQ的一对多和多对多关系的Pojo。 我存储玩家创建的位置(一对多关系)。一个位置可以容纳多个可能访问它的其他玩家(多对多)。数据库布局可归结为以下内容: 在我的java应用程序中,所有这些信息都存储在一个pojo中。请注意,玩家和受邀玩家列表可以从应用程序中更新,也需要在数据库中更新: 我可以使用JOOQ的pojo映射将这三个记录映射到单个pojo吗?我可以使用这个p

    • 本文向大家介绍一对一、一对多的关联查询 ?相关面试题,主要包含被问及一对一、一对多的关联查询 ?时的应答技巧和注意事项,需要的朋友参考一下

    • 这是项目迁移 这是时间表 这样用户就可以迁移了 这是我的项目模型 这是我的时间表模型: 这是我的用户模型 现在,我从项目返回我的查询 这是可以的,但user_id用户在timesheets.user_id我不能得到它的时间表,并得到它 此控制器按时间表中的项目id返回项目和时间表,但时间表中的用户id我不知道如何将其输入系统