12

我遇到了这个问题:

java.lang.String cannot be cast to java.lang.Enum

当我尝试这个HQL时:

...
query = em.createQuery("SELECT object from Entity object where object.column = ?");
query.setParameter(1, "X");
return query.getResultList();

在 DB 中,类型是带有检查约束的Varchar2(x) ,实体中的变量是使用标记 @Enumerated(EnumType.STRING) 使用Enum定义的:

public enum ColumnEnum {
    X, Y;
}
4

3 回答 3

24

如果该字段被定义为枚举,则必须将枚举作为参数传递:

query.setParameter(1, TypeEnum.X);

并让 Hibernate 使用映射将参数转换为 String(如果@Enumerated(EnumType.STRING)使用)或 int(如果@Enumerated(EnumType.ORDINAL)使用)。

于 2012-08-07T07:08:57.810 回答
3

使用以下注释

@Enumerated (value = EnumType.STRING)

或者

Query q = session.createQuery(from Comment c where c.rating = :rating);
q.setParameter(rating,
               Rating.LOW,
               Hibernate.custom(RatingUserType.class));
于 2012-08-07T07:47:43.663 回答
0

这是示例,有两种方法。

  • 第一种方法是明确提供枚举
  • 第二个更方便的方法是提供一个字符串表示,如果一个字段被枚举为 sring。

    public Optional<AffectedAsset> getByEntityId(Long entityId, String assetType) {
    String hql = "FROM AffectedAsset a WHERE a.entityId = :entityId "
            + "                        AND a.type = :assetType "
            + "   ORDER BY id DESC";
    Query query = getSession().createQuery( hql );
    query.setLong( "entityId", entityId );
    // little bit cumbersome : 
    // query.setParameter( "assetType", AffectedAsset.Type.valueOf( assetType.toUpperCase() ) );
    // my preferred way :
    query.setString( "assetType", assetType.toUpperCase() );
    query.setReadOnly( true );
    query.setMaxResults( 1 );

    AffectedAsset res = (AffectedAsset) query.uniqueResult();
    return Optional.ofNullable( res );
}
于 2021-03-30T10:10:31.350 回答