这是代码:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Contact.class)
    .add(Restrictions.like("gender", "male", MatchMode.ANYWHERE)));
List<Object[]> contactList = criteria.list();

其中性别是Contact.java中的枚举类型列
@Entity
@Table(name = "contact_master")
public class Contact {

      public enum Gender {
           MALE,FEMALE
      }

      @Column(name = "gender")
      @Enumerated(EnumType.STRING)
      private Gender gender;

      public Gender getGender() {
         return gender;
      }

      public void setGender(Gender gender) {
          this.gender = gender;
      }

}

当我在上面的代码上运行时,我得到像这样的异常:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

最佳答案

您可以定义另一个String类型的不可插入且不可更新的字段,该字段映射到同一列:

@Entity
@Table(name = "contact_master")
public class Contact {

      public enum Gender {
           MALE,FEMALE
      }

      @Column(name = "gender")
      @Enumerated(EnumType.STRING)
      private Gender gender;

      @Column(name = "gender", insertable = false, updatable = false)
      private String genderAsText;

      public Gender getGender() {
         return gender;
      }

      public void setGender(Gender gender) {
          this.gender = gender;
      }
}

您不需要它的getter和setter,并且只能在需要将gender视为纯文本的查询中使用它:
Criteria criteria = session.createCriteria(Contact.class)
    .add(Restrictions.ilike("genderAsText", "male", MatchMode.ANYWHERE)));

请注意,我也使用Restrictions.ilike方法,因为您可能希望比较不区分大小写。

07-28 04:13
查看更多