2012-12-18 2 views
1

JPQL 쿼리로 참조 번호 ReservationInstance이없는 Reservation을 DB에서 검색하고 싶습니다. ReservationInstance 엔티티에는 Reservation 엔티티가 있습니다. 단방향으로 OneToOne입니다.JPQL은 참조 레코드가없는 레코드를 검색 할 수 있습니까?

예약 표

ID  NAME 
0001 AAA 
0002 BBB 
0003 CCC 
0004 DDD 

ReservationInstance 표

ID  SOME_COLUMN  RESERVATION_ID 
0001 somedata  0004 

가 어떻게 더 ReservationInstance 참조가 없습니다 (AAA, BBB 및 CCC의 경우) Reservation 목록을 검색 할 수 있습니까?

내 엔티티

public class Reservation implements Serializable { 
    ..... 
    private String id; 
    ..... 
    private String name; 
    //getter and setter 
} 

public class ReservationInstance implements Serializable { 
    .... 
    private String id; 
    .... 
    private Date fromTime; 
    .... 
    private Date toTime; 

    @OneToOne 
    @JoinColumn(name = "RESERVATION_ID", referencedColumnName = "ID") 
    private Reservation reservation; 
} 

업데이트 후

는 내가 예외를 얻을

SELECT r FROM Reservation r LEFT JOIN ReservationInstance ri WHERE ri.reservation IS NULL 

아래와 같은 쿼리를 사용

[EL Severe]: 2012-12-18 16:37:02.817--ServerSession(1733641680)--Local Exception Stack: 
Exception [EclipseLink-8023] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [Reservation.findAbandonedReservation: SELECT r FROM Reservation r LEFT JOIN ReservationInstance ri WHERE ri.reservation.id IS 
NULL]. 
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException 
    at org.eclipse.persistence.exceptions.JPQLException.syntaxError(JPQLException.java:352) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:350) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:242) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:359) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.joinAssociationPathExpression(JPQLParser.java:11880) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.join(JPQLParser.java:11488) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.identificationVariableDeclaration(JPQLParser.java:11302) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.fromClause(JPQLParser.java:11164) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:355) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:275) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:130) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:91) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:207) 
    at org.eclipse.persistence.internal.jpa.JPAQuery.processJPQLQuery(JPAQuery.java:106) 
    at org.eclipse.persistence.internal.jpa.JPAQuery.prepare(JPAQuery.java:90) 
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:509) 
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:470) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQueries(AbstractSession.java:1815) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:409) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:666) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:615) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:389) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:164) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:221) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:209) 
    at org.ace.mrbs.ost.comp.reservation.persistence.ReservationDAO.deleteAbandonedReservation(ReservationDAO.java:110) 
    at org.ace.mrbs.ost.comp.reservation.persistence.ReservationDAO.main(ReservationDAO.java:130) 
Caused by: org.eclipse.persistence.internal.libraries.antlr.runtime.EarlyExitException 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.joinAssociationPathExpression(JPQLParser.java:11868) 
    ... 23 more 
+0

엔티티를 보여 주실 수 있습니까? (관계를 더 잘 이해하기 위해) –

+0

@AviramSegal, 법인을 업데이트했습니다. – CycDemo

답변

3

나의 첫 번째 선택은 양방향 관계를 만드는 것입니다. 일부 쿼리를 r.id IS NOT IN 수익 ID를 사용하려고하지 않을 경우이, 작동

SELECT r FROM Reservation r WHERE r IS NOT IN (SELECT ri.reservation FROM ReservationInstance ri) 

100 % 확인 :

그래서 나는 이런 식으로 뭔가를 제안 ON으로 가입 만 JPA 2.1에서 지원됩니다 LEFT을 해제합니다.

+0

죄송합니다. 나는 엔티티 관계가 그리워. 내 게시물을 업데이트합니다. 다시 드릴까요? – CycDemo

+0

내 대답 업데이트 –

+0

EclipseLink 2.4는 이미 ON을 지원합니다. – James

관련 문제