我正在使用Play Framework 2.1.0和Ebean,在查询下面列出的以下场景时遇到问题:
我有3个类来代表数据库中的表。
class project {
...
@OneToMany
public SubProject sub;
}
class SubProject {
...
@ManyToOne
public Project project;
@OneToMany
public MiniProject mini;
}
class MiniProject {
...
@ManyToOne
public SubProject sub;
}
使用Ebean ,如何
检索项目列表的所有子项目?
检索项目的所有微型项目?
给出一个子项目列表,如何检索所有的微型项目?
答案 0 :(得分:3)
首先,您错误地定义了类。您的@OneToMany注释应该在元素列表上定义。我更正了这些映射,然后编写了检索所需查询的测试方法。这是代码:
项目类:
@Entity
public class Project {
@Id
public Long id;
@OneToMany(mappedBy="project")
public List<SubProject> subprojects;
}
SubProject类:
@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);
}
}
答案 1 :(得分:0)
假设实体已修复,实际上您的OneToMany关联有List<SubProject>
或Set<SubProject>
(对于MiniProject来说相同):
检索项目列表的所有子项目?
select s from Project p inner join p.subProjects s where p.id in :projectIds
检索项目的所有微型项目?
select m from Project p
inner join p.subProjects s
inner join s.miniProjects m
where p.id = :projectId
给出了一个子项目列表,如何检索所有的微型项目。
与第一次查询相同:
select m from SubProject s inner join s.miniProjects m where s.id in :subProjectIds
答案 2 :(得分: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)