Search code examples
javamysqlhibernateenumscriteria

Getting error while executing criteria query on enum column in mysql table hibernate


This is the code :

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

Where gender is enum type column in 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;
      }

}

When i run above code i am getting exception like :

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

Solution

  • You can define another non-insertable and non-updatable field of String type mapped to the same column:

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

    You don't need getters and setters for it and you can use it only in queries in which you need to treat gender as plain text:

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

    Note that I also use Restrictions.ilike method as you probably want the comparison to be case insensitive.