我遇到了这个问题:
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),并且使用 Enum 定义实体中的变量标签@Enumerated(EnumType.STRING):
public enum ColumnEnum {
X, Y;
}
答案 0 :(得分:21)
如果字段定义为枚举,则必须将枚举作为参数传递:
query.setParameter(1, TypeEnum.X);
让Hibernate使用映射将参数转换为String(如果使用@Enumerated(EnumType.STRING)
)或转换为int(如果使用@Enumerated(EnumType.ORDINAL)
)。
答案 1 :(得分:3)
使用以下注释
@Enumerated (value = EnumType.STRING)
OR
Query q = session.createQuery(from Comment c where c.rating = :rating);
q.setParameter(rating,
Rating.LOW,
Hibernate.custom(RatingUserType.class));
答案 2 :(得分:0)
这是示例,有两种方式。
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 );
}