在mysql表hibernate中对枚举列执行条件查询时获取错误

raj*_*esh 6 java mysql enums hibernate criteria

这是代码:

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

性别是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;
      }

}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码我得到例外,如:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum
Run Code Online (Sandbox Code Playgroud)

Dra*_*vic 6

您可以定义另一个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;
      }
}
Run Code Online (Sandbox Code Playgroud)

您不需要getter和setter,只能在需要将其gender视为纯文本的查询中使用它:

Criteria criteria = session.createCriteria(Contact.class)
    .add(Restrictions.ilike("genderAsText", "male", MatchMode.ANYWHERE)));
Run Code Online (Sandbox Code Playgroud)

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