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