2013-03-31 46 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)