2010-12-20 4 views
0

내가 문제 사용에 기준 API를 JPA 쿼리를 변환하는 데에 기준 API 쿼리에 JPQL 변환 예외JPA 2 개 기준 API - EclipseLink가

나는 통과 일치하는 ServiceUser을 찾기 위해 시도하는 다음 쿼리를 주소 매개 변수. ServiceUser는 구체적인 하위 클래스 인 Child 및 Adult가있는 추상 엔티티입니다. 나는 ServiceUser 클래스에서 합친 상속 전략을 사용하고 있습니다.

이 메서드를 호출하면 모든 것이 잘 작동합니다.

public Set<T> findByAddress(Address address) { 

    Query query = manager.createQuery("SELECT distinct s FROM ServiceUser AS s JOIN s.addressHistory as h where h = :address"); 
    query.setParameter("address", address); 

    HashSet<T> result = new HashSet<T>(); 
    for (Object s : query.getResultList()) { 
     // tClass is the runtime type of the generic session bean. 
     if (this.tClass.isInstance(s)) { 
      result.add((T) s); 
     } 
    } 

    return result; 
} 

하지만, 내가 여기에 예외

public Set<T> findByAddress(Address address) { 

    CriteriaBuilder cb = manager.getCriteriaBuilder(); 
    CriteriaQuery<ServiceUser> cq = cb.createQuery(ServiceUser.class); 
    Root<ServiceUser> su = cq.from(ServiceUser.class); 

    Join<ServiceUser, Address> addressHistory = su.join(ServiceUser_.addressHistory); 
    cq.select(su).distinct(true).where(cb.equal(addressHistory, cb.parameter(Address.class, "address"))); 
    TypedQuery<ServiceUser> q = manager.createQuery(cq); 
    q.setParameter("address", address); 

    HashSet<T> result = new HashSet<T>(); 
    for (ServiceUser s : q.getResultList()) { 
     // tClass is the runtime type of the generic session bean. 
     if (this.tClass.isInstance(s)) { 
      result.add((T) s); 
     } 
    } 

    return result; 
} 

을 받고 스택 트레이스 로깅을 Eclipslink 것이다하고 다음 생성 된 메타 모델과 typedquery을 사용하여 다음과 기능을 대체하려고합니다. NulPointerException이 발생하는 것 같지만 왜 그럴 수 있습니까? 실패한 기준 API 쿼리를 발급하고 내가 JPA 문자열 쿼리와 쿼리를 수행 할 때 발행됩니다은 SQL과 비교 가져옵니다 SQL을 보면

/** 
Test : shouldBeAbleToFindChildByAddress() 
uk.gov.sunderland.ccms.model.bean.ChildService.findByAddress(Address[id=1,lineOne=7,lineTwo=Camberwell Way,lineThree=Moorside,lineFour=Sunderland,postcode=SR7 3XN]) 
[EL Finer]: 2010-12-20 12:39:42.89--ServerSession(7055953)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--client acquired 
[EL Finer]: 2010-12-20 12:39:42.89--UnitOfWork(22763294)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--TX binding to tx mgr, status=STATUS_ACTIVE 
[EL Finest]: 2010-12-20 12:39:42.89--UnitOfWork(22763294)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--Execute query ReadObjectQuery(referenceClass=Address sql="SELECT ID, LINE_TWO, LINE_THREE, LINE_ONE, LINE_FOUR, POSTCODE FROM ADDRESS WHERE (ID = ?)") 
[EL Finest]: 2010-12-20 12:39:42.906--UnitOfWork(22763294)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--Execute query ReadAllQuery(referenceClass=ServiceUser) 
[EL Finest]: 2010-12-20 12:39:42.906--ServerSession(7055953)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--reconnecting to external connection pool 
[EL Fine]: 2010-12-20 12:39:42.906--ServerSession(7055953)--Connection(32184426)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--SELECT DISTINCT t2.SERVICE_USER_TYPE FROM ADDRESS t0, SERVICE_USER t2, SERVICE_USER_ADDRESS t1 WHERE ((? = t0.ID) AND ((t1.SERVICE_USER_ID = t2.ID) AND (t0.ID = t1.ADDRESS_ID))) 
     bind => [1] 
[EL Finer]: 2010-12-20 12:39:42.906--UnitOfWork(22763294)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--class uk.gov.sunderland.ccms.model.entity.Adult 
[EL Finest]: 2010-12-20 12:39:42.906--ServerSession(7055953)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--reconnecting to external connection pool 
[EL Fine]: 2010-12-20 12:39:42.906--ServerSession(7055953)--Connection(29495316)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--SELECT DISTINCT t0.ID, t0.SERVICE_USER_TYPE, t0.TITLE, t0.DOB, t0.GENDER, t0.DISABILITY, t0.ETHNICITY, t1.ID, t1.EMPLOYMENT, t1.INFO_PACK_REQUIRED, t1.HOME_PHONE, t1.OTHER_LANGUAGE, t1.REFERRER, t1.MOBILE_PHONE, t1.LONE_PARENT, t1.GP_PRACTICE, t1.CONTACTABLE, t1.WORK_PHONE, t1.BABY_DUE_DATE, t1.ENGLISH_LEVEL FROM SERVICE_USER_ADDRESS t3, ADDRESS t2, ADULT t1, SERVICE_USER t0 WHERE (((? = t2.ID) AND ((t1.ID = t0.ID) AND (t0.SERVICE_USER_TYPE = ?))) AND ((t3.SERVICE_USER_ID = t0.ID) AND (t2.ID = t3.ADDRESS_ID))) 
     bind => [1, 1] 
[EL Warning]: 2010-12-20 12:39:42.906--UnitOfWork(22763294)--Thread(Thread[pool-52-thread-1,5,grizzly-kernel])--java.lang.NullPointerException 
     at org.eclipse.persistence.descriptors.InheritancePolicy.selectAllRowUsingDefaultMultipleTableSubclassRead(InheritancePolicy.java:1355) 
     at org.eclipse.persistence.descriptors.InheritancePolicy.selectAllRowUsingMultipleTableSubclassRead(InheritancePolicy.java:1396) 
     at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2493) 
     at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:407) 
     at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1074) 
     at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:736) 
     at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1034) 
     at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:380) 
     at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1112) 
     at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2909) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1291) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1273) 
     at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1247) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:479) 
     at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:714) 
*/ 

.

기준 쿼리

SELECT DISTINCT t0.ID, t0.SERVICE_USER_TYPE, t0.TITLE, t0.DOB, t0.GENDER, t0.DISABILITY, t0.ETHNICITY, t1.ID, t1.EMPLOYMENT, t1.INFO_PACK_REQUIRED, t1.HOME_PHONE, t1.OTHER_LANGUAGE, t1.REFERRER, t1.MOBILE_PHONE, t1.LONE_PARENT, t1.GP_PRACTICE, t1.CONTACTABLE, t1.WORK_PHONE, t1.BABY_DUE_DATE, t1.ENGLISH_LEVEL 
FROM SERVICE_USER_ADDRESS t3, ADDRESS t2, ADULT t1, SERVICE_USER t0 
WHERE (((? = t2.ID) AND ((t1.ID = t0.ID) AND (t0.SERVICE_USER_TYPE = ?))) 
AND ((t3.SERVICE_USER_ID = t0.ID) AND (t2.ID = t3.ADDRESS_ID))) 

JPA 문자열 쿼리

SELECT DISTINCT t0.ID, t0.SERVICE_USER_TYPE, t0.TITLE, t0.DOB, t0.GENDER, t0.DISABILITY, t0.ETHNICITY, t1.ID, t1.EMPLOYMENT, t1.INFO_PACK_REQUIRED, t1.HOME_PHONE, t1.OTHER_LANGUAGE, t1.REFERRER, t1.MOBILE_PHONE, t1.LONE_PARENT, t1.GP_PRACTICE, t1.CONTACTABLE, t1.WORK_PHONE, t1.BABY_DUE_DATE, t1.ENGLISH_LEVEL 
FROM SERVICE_USER_ADDRESS t3, ADDRESS t2, ADULT t1, SERVICE_USER t0 
WHERE (((? = t2.ID) AND ((t1.ID = t0.ID) AND (t0.SERVICE_USER_TYPE = ?))) 
AND ((t3.SERVICE_USER_ID = t0.ID) AND (t2.ID = t3.ADDRESS_ID))) 

SELECT DISTINCT t0.ID, t0.SERVICE_USER_TYPE, t0.TITLE, t0.DOB, t0.GENDER, t0.DISABILITY, t0.ETHNICITY, t1.ID 
FROM SERVICE_USER_ADDRESS t3, ADDRESS t2, CHILD t1, SERVICE_USER t0 WHERE (((? = t2.ID) AND ((t1.ID = t0.ID) AND (t0.SERVICE_USER_TYPE = ?))) AND ((t3.SERVICE_USER_ID = t0.ID) AND (t2.ID = t3.ADDRESS_ID))) 

내가 볼 수 ServiceUser의 성인 서브 클래스를 다루는 첫 번째 부분 두 경우 모두 동일하지만 아동에 올 때 기준 쿼리가이 EclipseLink가 버그가 될 수

[EL Warning]: 2010-12-20)--java.lang.NullPointerException 
     at org.eclipse.persistence.descriptors.InheritancePolicy.selectAllRowUsingDefaultMultipleTableSubclassRead(InheritancePolicy.java:1355) 

을 던져 서브 클래스?

답변

0

예 이것은 참으로 추상 기본 클래스 SERVICE_USER에

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 

@Inheritance(strategy = InheritanceType.JOINED) 

에서 EclipseLink가 상속 전략을 변경

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>eclipselink</artifactId> 
    <version>2.1.1</version> 
    <scope>provided</scope> 
</dependency> 

에 버그가 나타납니다 해결 방법을 제공합니다 내 경우에는 괜찮아.