我想通过 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 无法在 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();
感谢您提供任何有助于解决我的问题的解决方案或提示。