如何查询具有枚举值并使用CriteriaQuery的JPA ElementCollection映射中的键?

时间:2013-06-25 15:38:11

标签: java java-ee eclipselink criteria-api

我想通过ElementCollection Map的键过滤实体,但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;
    }
}

现在我尝试使用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无法强制转换为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”强制转换为Enum。

我对col或我的查询构造的注释有问题吗? 通常我没有使用api标准,但在这种情况下我必须使用。

更新 如果我使用jpql查询也会出现问题:

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

感谢任何有助于解决问题的解决方案或提示。

1 个答案:

答案 0 :(得分:1)

好像是一个错误。尝试2.5版本,如果仍然失败,请记录一个错误。

解决方法是使用本机查询,或者在JPQL中使用COLUMN运算符(或Criteria中的Expression),或将关系映射为OneToMany而不是ElementCollection。