2013-03-31 15 views
5

Używam Odtwórz Framework 2.1.0 i Ebean i mam problem podczas wysyłania zapytań następujące scenariusze wymienione poniżej:Howo kwerendy tabele z onetomany i relacji manytoone użyciu Ebean

Mam 3 klas, które reprezentują tabel baza danych.

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

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

    @OneToMany 
    public MiniProject mini;  
} 

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

Korzystanie Ebean, jak

  • pobrać wszystkie podprojekty dotyczące listy projektów?

  • odzyskać wszystkie miniprojekty projektu?

  • biorąc pod uwagę listę podprojektów, jak odzyskać wszystkie miniprojekty?

+0

masz na myśli z JPQL/HQL? – willome

+0

EBean jest oparty na JPA, więc zarówno JPQL, jak i HQL będą działać, jak sądzę. –

Odpowiedz

3

Przede wszystkim definiowania klas nieprawidłowo. Twoje adnotacje @OneToMany powinny być zdefiniowane na listach elementów. Poprawiłem te mapowania, a następnie napisałem metodę testowania, która pobiera pożądane zapytania. Oto kod:

klasa Projekt:

@Entity 
public class Project { 

    @Id 
    public Long id; 

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

klasa podprojektu:

@Entity 
public class SubProject { 

    @Id 
    public Long id; 

    @ManyToOne 
    public Project project; 

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

MiniProject klasa:

@Entity 
public class MiniProject { 

    @Id 
    public Long id; 

    @ManyToOne 
    public SubProject subproject; 
} 

Metoda badawcza:

@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

Zakładając podmioty są stałe, a w rzeczywistości mają List<SubProject> lub Set<SubProject> dla stowarzyszenia OneToMany (takie same dla MiniProject):

pobrać wszystkie podprojekty dotyczące listy projektów?

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

pobrać wszystkie miniprojects projektu?

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

podano listę projektów cząstkowych, jak pobrać wszystkie miniprojects.

samo jak pierwszego zapytania:

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

Proszę dodać/odesłać mnie do przykładu implementacji java ebean.dzięki –

+0

Mówisz sobie, że eBean jest implementacją JPA. Powyższe jest standardowym JPQL. –

0

Zdefiniuj pomocnika w swoich klasach

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

Zapytania:

SubProject.find.where().in("project", listOfProject) 
MiniProject.find.where().eq("sub.project",yourProject) 
MiniProject.find.where().in("sub", listOfSubProject) 
Powiązane problemy