2013-03-31 7 views
5

I Play-Framework 2.1.0 und Ebean verwenden und ich ein Problem habe, während die folgenden Szenarien unten aufgeführten Abfrage:Howo abfragen Tabellen mit OneToMany und manytoone Beziehung Ebean mit

, die ich habe 3 Klassen repräsentieren Tabellen in die Datenbank.

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

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

    @OneToMany 
    public MiniProject mini;  
} 

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

Ebean Mit, wie man

  • alle Teilprojekte aus einer Liste von Projekten abrufen?

  • rufen Sie alle Miniprojekte eines Projekts ab?

  • eine Liste von Unterprojekten gegeben, wie alle Miniprojekte abgerufen werden?

+0

Sie meinen mit JPQL/HQL? – willome

+0

EBean basiert auf JPA, also funktionieren sowohl JPQL als auch HQL. –

Antwort

3

Zu allererst Sie Ihre Klassen falsch definiert. Ihre @ OneToMany Annotationen sollten über Listen von Elementen definiert werden. Ich habe diese Zuordnungen korrigiert und dann die Testmethode geschrieben, um die gewünschten Abfragen abzurufen. Hier ist der Code:

Projektklasse:

@Entity 
public class Project { 

    @Id 
    public Long id; 

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

Teilprojekt Klasse:

@Entity 
public class SubProject { 

    @Id 
    public Long id; 

    @ManyToOne 
    public Project project; 

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

MiniProject Klasse:

@Entity 
public class MiniProject { 

    @Id 
    public Long id; 

    @ManyToOne 
    public SubProject subproject; 
} 

Testmethode:

@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

Unter der Annahme, die Einheiten festgelegt sind, und Sie haben in der Tat eine List<SubProject> oder eine Set<SubProject> für Ihre OneToMany Vereinigung (gleich für MiniProject):

abrufen alle Teilprojekte aus einer Liste von Projekten?

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

abrufen alle miniprojects eines Projekts?

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

eine Liste von Unter Projekte, wie alle miniprojects abzurufen.

gleiche wie erste Abfrage:

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

Bitte fügen Sie eine Java-Beispielimplementierung hinzu.danke –

+0

Sie sagen selbst, dass Ebean eine JPA-Implementierung ist. Das Obige ist Standard JPQL. –

0

Definieren Sie die Helfer in Ihren Klassen

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

Die Abfragen:

SubProject.find.where().in("project", listOfProject) 
MiniProject.find.where().eq("sub.project",yourProject) 
MiniProject.find.where().in("sub", listOfSubProject) 
Verwandte Themen