2012-07-13 67 views
0

现在,在一个简短的例子中,如果我有两个实体PersonApplicant,我想编写一个查询来获取所有申请人在我的数据库中,我最终得到引用的查询与以下设置向上。我正在使用Single_Table_Inheritance策略(fyi)EclipseLink继承查询:避免加入

public class Person { 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "schoolID") 
    private School school; 
} 

Teacher对象引用另一个实体。

是跳跃和尝试查询学校的关系,人

public List<Applicant> getAllApplicants(){ 

     EntityManager entityManager = factory.createEntityManager(); 
     @SuppressWarnings("unchecked") 
     List<Applicant> applicants = entityManager.createQuery("Select a from Applicant a LEFT JOIN FETCH a.schools WHERE a.active = :active ") 
     .setParameter("active", true).setHint("eclipselink.refresh", "true") 
     .getResultList(); 
     //List<Applicant> applicants = Applicant.findAllApplicants(); 
     System.out.println("The long query getting applicants"); 
     entityManager.close(); 
     return applicants; 
    } 

如果我试图改变我的查询使用嵌套的加盟

public class Applicant extends Person { 

    @OneToMany(targetEntity = ApplicantSchool.class, cascade = { javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.REMOVE }, mappedBy = "applicant") 
    private Set<ApplicantSchool> schools = new HashSet<ApplicantSchool>(); 
} 

查询尝试,我得到一个错误说无法识别的关系。我想查询像这样:

entityManager.createQuery("Select a from Applicant a LEFT JOIN FETCH a.schools WHERE LEFT JOIN FETCH a.person.school a.active = :active ") 

修订

取出关键字后,“左连接抓取”我的新查询:

List<Applicant> applicants = entityManager.createQuery("Select a from Applicant a WHERE a.active = :active ") 
     .setParameter("active", true) 
     .getResultList(); 

唯一查询我第一次与它同意创建是这一个

SELECT personID, TYPE, DATEADDED, FIRSTNAME, LASTNAME, MIDDLENAME, ACTIVE, BIRTHDAY, EMAILADDRESS, ETHNICITY, GENDER, HISPANIC, IMAGEPATH, MARITAL, NATIVELANGUAGE, PRIMARYTELEPHONE, RELIGIOUSAFFILIATION, SECONDARYTELEPHONE, version, addressID, schoolID, MAJOR FROM PERSON WHERE ((ACTIVE = ?) AND (TYPE = ?)) 
    bind => [true, AP] 

返回这个堆栈tra ce和下列sql的选择被创建:

[EL Fine]: sql: 2012-07-13 17:25:52.297--ServerSession(1529073996)--Connection(726700617)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT schoolID, ACTIVE, ADMISSIONSEMAILADDRESS, ADMISSIONSPHONE, CODE, description, HELPGENERALEMAILADDRESS, NAME, PRIMARYPHONE, version, addressID FROM SCHOOL WHERE (schoolID = ?) 
    bind => [1] 
[EL Fine]: sql: 2012-07-13 17:25:52.305--ServerSession(1529073996)--Connection(1615948530)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT id, ACTIVE, CODE, DESCRIPTION, NAME, version, SCHOOLDEPARTMENT_schoolID FROM DEPARTMENT WHERE (SCHOOLDEPARTMENT_schoolID = ?) 
    bind => [1] 
[EL Fine]: sql: 2012-07-13 17:25:52.308--ServerSession(1529073996)--Connection(893810654)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT programID, ACTIVE, CODE, description, NAME, PROGRAMTYPE, REQUIREDCREDITS, version, SCHOOL_schoolID FROM PROGRAM WHERE (SCHOOL_schoolID = ?) 
    bind => [1] 
[EL Fine]: sql: 2012-07-13 17:25:52.31--ServerSession(1529073996)--Connection(399107363)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT personID, TYPE, DATEADDED, FIRSTNAME, LASTNAME, MIDDLENAME, ACTIVE, BIRTHDAY, EMAILADDRESS, ETHNICITY, GENDER, HISPANIC, IMAGEPATH, MARITAL, NATIVELANGUAGE, PRIMARYTELEPHONE, RELIGIOUSAFFILIATION, SECONDARYTELEPHONE, version, addressID, schoolID, MAJOR, studentId FROM PERSON WHERE (schoolID = ?) 
    bind => [1] 
[EL Fine]: sql: 2012-07-13 17:25:52.314--ServerSession(1529073996)--Connection(464642021)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT registrationId, SEMESTERTYPE, version, YEAR, semesterCourseId, personID FROM REGISTRATION WHERE (personID = ?) 
    bind => [501] 
[EL Fine]: sql: 2012-07-13 17:25:52.322--ServerSession(1529073996)--Connection(395757277)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT registrationId, SEMESTERTYPE, version, YEAR, semesterCourseId, personID FROM REGISTRATION WHERE (personID = ?) 
    bind => [552] 
[EL Fine]: sql: 2012-07-13 17:25:52.327--ServerSession(1529073996)--Connection(328677993)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT registrationId, SEMESTERTYPE, version, YEAR, semesterCourseId, personID FROM REGISTRATION WHERE (personID = ?) 
    bind => [602] 
[EL Fine]: sql: 2012-07-13 17:25:52.358--ServerSession(1529073996)--Connection(873312397)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT addressID, CITY, COUNTRY, STATE_US, STREETADDRESS, STREETADDRESS2, version, ZIPCODE FROM ADDRESS WHERE (addressID = ?) 
    bind => [2] 
[EL Fine]: sql: 2012-07-13 17:25:52.365--ServerSession(1529073996)--Connection(509650638)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT applicantSchoolID, CREDITSCOMPLETED, FROMMONTH, FROMYEAR, GPA, NAME, SCHOOLTYPE, TOMONTH, TOYEAR, version, APPLICANT_personID FROM APPLICANTSCHOOL WHERE (APPLICANT_personID = ?) 
    bind => [151] 
[EL Fine]: sql: 2012-07-13 17:25:52.385--ServerSession(1529073996)--Connection(17334753)--Thread(Thread["http-bio-8080"-exec-18,5,main])--SELECT applicantSchoolID, CREDITSCOMPLETED, FROMMONTH, FROMYEAR, GPA, NAME, SCHOOLTYPE, TOMONTH, TOYEAR, version, APPLICANT_personID FROM APPLICANTSCHOOL WHERE (APPLICANT_personID = ?) 
    bind => [51] 
+0

我不明白你的问题。什么是申请人?它与人和老师有什么关系?你想查询返回什么? – 2012-07-13 21:49:20

+0

对不起,我将示例更改为申请人,这与申请人继承人相同。将问题更新给申请人。我想返回所有的申请人,但不想要学校领域,因为我已经添加了很多其他关系,默认情况下都会热切地加载所有的关系,当我尝试使用嵌套连接来获取时,我没有访问我父母的字段? – Warz 2012-07-13 21:52:09

+0

上面的查询检索申请人,每个申请人都有他们的学校组。你希望申请者拥有他们的学校,但如果没有学校实体中所有热切期待的协会,那是对的吗? – 2012-07-13 22:08:33

回答

0

您不能在JPA中嵌套连接,但您不应该在查询申请人时需要。
JPQL“从申请人中选择一个左连接获取a.schools左连接获取a.school,其中a.active =:active”应该工作,因为Appliant是一个人,因此具有学校关系。嵌套只有在申请人与人有关系且您需要取得人员和学校加入时才适用。

如果是这样的话,的EclipseLink允许批读取或通过这里描述的查询提示联接: http://wiki.eclipse.org/EclipseLink/Examples/JPA/QueryOptimization

您还可以指定配料/获取连接在使用这里所描述的EclipseLink注释匹配级别: http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_batchfetch.htm#CHDCCIDAhttp://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_joinfetch.htm#CEGFFHHA

批读取会导致2个查询,而在取1

加入了查询DES上面还可以使用:

em.createQuery("Select a from Applicant a WHERE a.active = :active ") 
     .setParameter("active", true) 
     .setQueryHint("eclipselink.left-join-fetch", "a.schools"); 
     .setQueryHint("eclipselink.left-join-fetch", "a.school"); 
     .getResultList(); 
+0

您的查询方法以及批处理获取文档都很有帮助。 – Warz 2012-07-16 23:42:09