2013-06-25 1 views
1

ElementCollection Map의 키를 사용하여 엔티티를 필터링하고 싶습니다. 그러나 EclipseLink는 예외를 발생시킵니다. 내 문제를 설명하기 위해 작은 엔티티 클래스가 있습니다.값이 enum이고 CriteriaQuery를 사용하는 JPA ElementCollection 맵에서 키를 쿼리하는 방법?

@Entity 
public class TestEntity { 
    public enum MyEnum { 
     FOO, 
     BAR; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "pkGen") 
    @TableGenerator(allocationSize = 1000, initialValue = 0, name = "pkGen", table = "PRIMARY_KEYS") 
    private int id; 

    @ElementCollection(targetClass = MyEnum.class) 
    @Enumerated(EnumType.STRING) 
    @MapKeyClass(String.class) 
    Map<String, MyEnum> col = new HashMap<>(); 

    public Map<String, MyEnum> getCol() { 
     return col; 
    } 
} 

지금 나는이 같은 COL 키 "는 foobar"모든 개체를 검색하려고 :

java.lang.ClassCastException가 :

@LocalBean 
public class EclipseLinkBean { 

@PersistenceContext 
private EntityManager em; 

    public void test() { 
     CriteriaBuilder builder = em.getCriteriaBuilder(); 
     CriteriaQuery<TestEntity> q = builder.createQuery(TestEntity.class); 
     Root<TestEntity> testEntity = q.from(TestEntity.class); 
     MapJoin<TestEntity, String, MyEnum> col = testEntity.joinMap("col"); 
     q.where(builder.equal(col.key(), "foobar")); 
     em.createQuery(q).getResultList(); 
    } 
} 

나는이 예외를 받고 있어요 : java.lang.String을 java.lang.Enum에 캐스팅 할 수 없습니다. at org.eclipse.persistence.mappings.converters.EnumTypeConverter.convertObjectValueToDataValue (EnumTypeConverter.java:160) ~ [org.eclipse.persistence.core_2.4.1.v20121003 -ad44345 .JAR : NA] 프로그램을 디버깅

, 그 EnumTypeConverter은 열거에 "는 foobar"를 캐스팅하기 위해 노력하고있다.

col 또는 쿼리 작성시 내 주석에 문제가 있습니까? 일반적으로 기준 API를 사용하고 있지 않지만이 경우에는해야합니다.

업데이트 : 나는 JPQL 쿼리를 사용하는 경우 문제가 발생합니다 : 모든 솔루션에 대한

em.createQuery("SELECT te FROM TestEntity te JOIN te.col c WHERE KEY(c) = 'foobar'").getResultList(); 

감사 또는 내 문제를 해결하는 데 도움이 힌트.

답변

1

버그가있는 것 같습니다. 2.5 릴리스를 사용해보고, 여전히 실패하면 버그를 기록하십시오.

해결 방법은 네이티브 쿼리를 사용하거나 JPQL에서 COLUMN 연산자 (또는 Expression in Criteria)를 사용하거나 ElementCollection 대신 Entity에 OneToMany 관계를 매핑하는 것입니다.

+0

2.5도 실패합니다. 나는 벌레를 기록 할 것이다. 감사합니다 – raffael

+0

내 문제를 설명하는 오래된 버그 보고서 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=328371)를 발견했습니다. 내가 그걸로 무엇을해야합니까? – raffael