这是代码:
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
方法,因为您可能希望比较不区分大小写。