2013-03-31 43 views
5

我使用播放框架2.1.0和Ebean和我有一个问题,同时查询下面列出的以下方案来查询与一对多和多对一关系的表数据库。豪沃使用Ebean

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

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

    @OneToMany 
    public MiniProject mini;  
} 

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

使用Ebean,以

  • 如何获取项目的列表的所有子项目?

  • 检索项目的所有小项目?

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

+0

你的意思是JPQL/HQL? – willome

+0

EBean基于JPA,所以JPQL和HQL都可以工作。 –

回答

3

第一。您的@OneToMany注释应该根据元素列表进行定义。我更正了这些映射,然后我编写了测试方法来检索所需的查询。下面是代码:

项目类:

@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; 
} 

MiniProject类:

@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); 
    } 
} 
0

假设实体是固定的,你其实有你的一对多关联(同为MiniProject)一List<SubProject>Set<SubProject>

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

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

检索项目的所有miniprojects?

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

定的子工程,如何检索所有miniprojects的列表。

一样第一个查询:

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

请添加/引荐我到一个java ebean示例实现。谢谢 –

+0

你在说自己ebean是一个JPA实现。以上是标准的JPQL。 –

0

定义助手在你的类

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)