1

ElementCollection マップのキーでエンティティをフィルタリングしたいのですが、EclipseLink によって例外がスローされます。私の問題を示す小さなエンティティ クラスがあります。

@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;
    }
}

ここで、次のように列キー「foobar」を持つすべてのエンティティを検索しようとします。

@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.ClassCastException: java.lang.String は org.eclipse.persistence.mappings.converters.EnumTypeConverter.convertObjectValueToDataValue(EnumTypeConverter.java:160) で java.lang.Enum にキャストできません ~[org.eclipse.persistence.core_2 .4.1.v20121003-ad44345.jar:na]

デバッグは、EnumTypeConverter が「foobar」を Enum にキャストしようとしていることを示しています。

col の注釈またはクエリの作成に何か問題がありますか? 通常は基準 API を使用しませんが、この場合は使用する必要があります。

更新: jpql クエリを使用すると、問題も発生します。

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

私の問題を解決するのに役立つ解決策やヒントをありがとう。

4

1 に答える 1

1

バグのようです。2.5 リリースを試してみて、それでも失敗する場合は、バグを記録してください。

回避策は、ネイティブ クエリを使用するか、JPQL で COLUMN 演算子 (または条件の式) を使用するか、関係を OneToMany として ElementCollection ではなくエンティティにマップすることです。

于 2013-06-26T14:19:06.443 に答える