2012-10-16 4 views
0

내 JPA 구현 프레임 워크로 Toplink Grid (Eclipselink)를 사용하고 있습니다. 나는 포함 가능한 개체 쿼리 기준을 사용하려고하는 동안 아래와 같은 AA 예외를 충족삽입 가능한 개체를 쿼리하는 데 기준 사용

:

Exception [EclipseLink-6119] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.QueryException 
Exception Description: The join expression 
Query Key conInfo 
    Base domain.de1003.Employee is not valid, or for a mapping type that does not support joining. 
Query: ReportQuery(referenceClass=Employee) 
    at org.eclipse.persistence.exceptions.QueryException.mappingForExpressionDoesNotSupportJoining(QueryException.java:659) 
    at org.eclipse.persistence.internal.queries.JoinedAttributeManager.prepareJoinExpression(JoinedAttributeManager.java:851) 
    at org.eclipse.persistence.internal.queries.JoinedAttributeManager.prepareJoinExpressions(JoinedAttributeManager.java:778) 
    at org.eclipse.persistence.internal.queries.ReportItem.initialize(ReportItem.java:171) 
    at org.eclipse.persistence.queries.ReportQuery.prepare(ReportQuery.java:1035) 
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:509) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:822) 
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:470) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:710) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1038) 
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:381) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1124) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2917) 
    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) 

내가 노력 코드는 다음과 같습니다 :

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<ContactInfo> cq = cb.createQuery(ContactInfo.class); 
Root<Employee> root = cq.from(Employee.class); 
cq.select(root.<ContactInfo> get("conInfo")); 
cq.where(cb.le(root.<Long> get("employId"), 3)); 

TypedQuery<ContactInfo> q = em.createQuery(cq); 
List<ContactInfo> results = q.getResultList(); 

가있는 CONTACTINFO가있다 주소 및 전화 세트로 구성된 임베드 가능 클래스. 전화는 문자열입니다.

도움이 될 것입니다. JPA - Criteria API and EmbeddedId

하지만 내 질문에 해결되지 않은 :

나는이 문제와 관련된 질문을 확인하십시오.

그리고 예제 코드를 찾을 수 없습니다.

다음과 같이 엔티티 코드 :

package domain.de1003; 

import java.io.IOException; 
import java.io.Serializable; 
import java.util.List; 

import javax.persistence.AttributeOverrides; 
import javax.persistence.AttributeOverride; 
import javax.persistence.CascadeType; 
import javax.persistence.CollectionTable; 
import javax.persistence.Column; 
import javax.persistence.ElementCollection; 
import javax.persistence.Embedded; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.persistence.Version; 

import oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer; 

import org.eclipse.persistence.annotations.Customizer; 

import com.tangosol.io.pof.PofReader; 
import com.tangosol.io.pof.PofWriter; 
import com.tangosol.io.pof.PortableObject; 

@Entity(name="Employee") 
@Table(name="EMPLOYEE") 
@Customizer(oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer.class) 
public class Employee implements PortableObject,Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@Column(name = "EM_ID") 
private long employId; 

@Column(name = "FIRSTNAME") 
private String firstName; 

@Column(name = "LASTNAME") 
private String lastName; 

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="homePhone", [email protected](name="HOMEPHONE")), 
    @AttributeOverride(name="workPhone", [email protected](name="WORKPHONE")) 
}) 
private ContactInfo conInfo; 

@Version 
private long version; 

public long getEmployId() { 
    return employId; 
} 

public void setEmployId(long employId) { 
    this.employId = employId; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public ContactInfo getConInfo() { 
    return conInfo; 
} 

public void setConInfo(ContactInfo conInfo) { 
    this.conInfo = conInfo; 
} 

public long getVersion() { 
    return version; 
} 

public void setVersion(long version) { 
    this.version = version; 
} 

@Override 
public void readExternal(PofReader pofReader) throws IOException { 
    employId = pofReader.readLong(1); 
    firstName = pofReader.readString(2); 
    lastName = pofReader.readString(3); 
    version = pofReader.readLong(4); 

} 

@Override 
public void writeExternal(PofWriter pofWriter) throws IOException { 
    pofWriter.writeLong(1, employId); 
    if(firstName != null) pofWriter.writeString(2, firstName); 
    if(lastName != null) pofWriter.writeString(3,lastName); 
    pofWriter.writeLong(4, version); 
} 

@Override 
public String toString() { 
    return "[" 
    + "employId = " + employId 
    + " firstName = " + firstName 
    + " lastName = " + lastName 
    + " contact inforamtion: " + conInfo 
    + "]"; 
} 

}

과 equivale를 들어 법인 CONTACTINFO

package domain.de1003; 

import java.io.IOException; 
import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Embeddable; 

import oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer; 

import org.eclipse.persistence.annotations.Customizer; 

import com.tangosol.io.pof.PofReader; 
import com.tangosol.io.pof.PofWriter; 
import com.tangosol.io.pof.PortableObject; 

@Embeddable 
@Customizer(oracle.eclipselink.coherence.integrated.config.GridCacheCustomizer.class) 
public class ContactInfo implements PortableObject,Serializable{ 

private static final long serialVersionUID = 1L; 

@Column(name = "ADDRESS") 
private String address; 

@Column(name = "HOMEPHONE") 
private String homePhone; 

@Column(name = "WORKPHONE") 
private String workPhone; 

@Column(name = "CELLPHONE") 
private String cellPhone; 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public String getHomePhone() { 
    return homePhone; 
} 

public void setHomePhone(String homePhone) { 
    this.homePhone = homePhone; 
} 

public String getWorkPhone() { 
    return workPhone; 
} 

public void setWorkPhone(String workPhone) { 
    this.workPhone = workPhone; 
} 

public String getCellPhone() { 
    return cellPhone; 
} 

public void setCellPhone(String cellPhone) { 
    this.cellPhone = cellPhone; 
} 

@Override 
public void readExternal(PofReader pofReader) throws IOException { 
    address = pofReader.readString(1); 
    homePhone = pofReader.readString(2); 
    workPhone = pofReader.readString(3); 
    cellPhone = pofReader.readString(4); 
} 

@Override 
public void writeExternal(PofWriter pofWriter) throws IOException { 
    if(address != null) pofWriter.writeString(1, address); 
    if(homePhone != null) pofWriter.writeString(2, homePhone); 
    if(workPhone != null) pofWriter.writeString(3, workPhone); 
    if(cellPhone != null) pofWriter.writeString(4, cellPhone); 
} 

@Override 
public String toString() { 
    return "[" 
    + "address = " + address 
    + " homePhone = " + homePhone 
    + " workPhone = " + workPhone 
    + " cellPhone = " + cellPhone 
    + "]"; 
} 

}

제임스 TO

nt JQPL

쿼리 쿼리 = em.createQuery ("SELECT e.conInfo FROM Employee e where e.employId < 3");

근무했습니다.

답변

0

필자는 EclipseLink (2.5 야간)에서 이것을 재현하려고 시도했지만 할 수 없었습니다. 나는 그것이 추가 API를 변경 기준으로 해결 될 수 있습니다 용의자 지원 - 당신이 그것을 확인하는 기회를 줄 수 있습니까? 최신 버전의 EclipseLink를 사용하여 테스트하려면 캐시를 꺼야 할 수도 있습니다.

+0

고마워요! 방금 2.5 야간 빌드를 다운로드하면 작동하지만 예외는 사라졌습니다. 나는 그 코드 변화를 추적 할 것이다. 우리는 여전히 우리 제품에 EclpseLink2.1.2를 적용하고 있습니다. 그리고 나는 예외를 팝업하는 최신 릴리스 v2.4.1로만 테스트했습니다. – DonkeyRider

0

conInfo가 속성의 올바른 이름 (엔티티 코드 포함)인지 확인하십시오.

동등한 JPQL이 작동합니까?

+0

엔티티 코드와 이에 상응하는 JPQL로 업데이트하십시오. – DonkeyRider

+0

"get"이 아닌 "join"을 사용하는 것과 같은 오류가 발생하여 코드를 올바르게 컴파일/전개했는지 확인하십시오. 그렇지 않으면 버그 일 수 있으며 최신 릴리스인지 확인하고 버그를 기록하십시오. – James