Hibernate HQL转换:java.lang.String不能转换为java.lang.Enum

时间:2012-08-07 07:02:00

标签: java hibernate

我遇到了这个问题:

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

3 个答案:

答案 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)

这是示例,有两种方式。

  • 第一种方法是显式提供枚举
  • 第二个更方便的方法是提供一个字符串表示,如果一个字段被枚举为 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 );
}