Hibernate HQL转换:无法将java.lang.String转换为java.lang.Enum

Hibernate HQL转换:无法将java.lang.String转换为java.lang.Enum,java,hibernate,Java,Hibernate,我遇到了这个问题: java.lang.String cannot be cast to java.lang.Enum 当我尝试此HQL时: 其中,在DB中,类型是带有检查约束的Varchar2(x),实体中的变量是使用标记@Enumerated(EnumType.STRING)使用Enum定义的: 如果字段定义为枚举,则必须将枚举作为参数传递: query.setParameter(1, TypeEnum.X); 让Hibernate使用映射将参数转换为字符串(如果使用@Enumerate

我遇到了这个问题:

java.lang.String cannot be cast to java.lang.Enum
当我尝试此HQL时:

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


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

query.setParameter(1, TypeEnum.X);

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

使用以下注释

@Enumerated (value = EnumType.STRING)


下面是一个例子,有两种方法

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

public可选getByEntityId(长entityId,字符串assetType){
String hql=“FROM AffectedAsset a,其中a.entityId=:entityId”
+“和a.type=:assetType”
+“按id描述订购”;
Query Query=getSession().createQuery(hql);
setLong(“entityId”,entityId);
//有点麻烦:
//query.setParameter(“assetType”,AffectedAsset.Type.valueOf(assetType.toUpperCase());
//我喜欢的方式是:
query.setString(“assetType”,assetType.toUpperCase());
query.setReadOnly(true);
query.setMaxResults(1);
AffectedAsset res=(AffectedAsset)query.uniqueResult();
返回可选的空值(res);
}

不应该是
query.setParameter(1,TypeEnum.X)?我也尝试过,但收到的错误是相同的
query.setParameter(1, TypeEnum.X);
@Enumerated (value = EnumType.STRING)
Query q = session.createQuery(from Comment c where c.rating = :rating);
q.setParameter(rating,
               Rating.LOW,
               Hibernate.custom(RatingUserType.class));
    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 );
}