首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Ebean查询具有onetomany和多元关系的表

如何使用Ebean查询具有onetomany和多元关系的表
EN

Stack Overflow用户
提问于 2013-03-31 13:11:35
回答 3查看 2.3K关注 0票数 5

我使用Play Framework2.1.0和Ebean,在查询下面列出的下列场景时遇到了问题:

我有3个类,它们表示数据库中的表。

代码语言:javascript
复制
class project {
   ...
   @OneToMany
   public SubProject sub;   
}

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

   @OneToMany 
   public MiniProject mini;    
}   

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

使用Ebean,如何

  • 检索项目列表中的所有子项目?
  • 检索一个项目的所有小型项目?
  • 给出一个子项目列表,如何检索所有的小型项目?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-07 01:02:28

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

项目班:

代码语言:javascript
复制
@Entity  
public class Project {

    @Id
    public Long id;

   @OneToMany(mappedBy="project")
   public List<SubProject> subprojects;
}

SubProject类:

代码语言:javascript
复制
@Entity 
public class SubProject {

    @Id
    public Long id;

    @ManyToOne
    public Project project;

    @OneToMany(mappedBy="subproject") 
    public List<MiniProject> miniprojects; 
} 

MiniProject类:

代码语言:javascript
复制
@Entity 
public class MiniProject {

    @Id
    public Long id;

    @ManyToOne
    public SubProject subproject;
}

测试方法:

代码语言:javascript
复制
@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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-04-04 14:11:14

假设实体是固定的,并且实际上您有一个List<SubProject>Set<SubProject>来表示您的OneToMany关联(对于MiniProject也是如此):

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

代码语言:javascript
复制
select s from Project p inner join p.subProjects s where p.id in :projectIds

检索一个项目的所有小型项目?

代码语言:javascript
复制
select m from Project p 
inner join p.subProjects s 
inner join s.miniProjects m
where p.id = :projectId

给出一个子项目的列表,如何检索所有的小型项目。

与第一次查询相同:

代码语言:javascript
复制
select m from SubProject s inner join s.miniProjects m where s.id in :subProjectIds
票数 0
EN

Stack Overflow用户

发布于 2013-04-09 12:24:15

定义类中的助手

代码语言:javascript
复制
public static Finder<Long, YourClass> find = new Finder<Long, YourClass>(Long.class, YourClass.class);

这些查询:

代码语言:javascript
复制
SubProject.find.where().in("project", listOfProject)
MiniProject.find.where().eq("sub.project",yourProject)
MiniProject.find.where().in("sub", listOfSubProject)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15729699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档