我有一个@Entity
,其中有一个@Enumerated
字段映射到它:
@Entity
@Table
public class Device implements Serializable {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private DeviceType typeOfDevice;
[....]
}
DeviceType
是典型的Java 5枚举:public enum DeviceType {
MOBILE(true), EMAIL(false);
private final boolean fubar;
private DeviceType(boolean fubar) {
this.fubar= fubar;
}
public boolean isFubar() {
return fubar;
}
}
如何查询具有
Device
的typeOfDevice.isFubar() == true
实体?return factory.getCurrentSession().createCriteria(Device.class).
add(Restrictions.eq("typeOfDevice.isFubar", true)).list();
表现不佳:
return factory.getCurrentSession().createCriteria(Device.class).
createCriteria("typeOfDevice").add(Restrictions.eq("fubar", true)).list();
最佳答案
似乎可以通过以下方式解决您的问题:
Criteria criteria = factory.getCurrentSession().createCriteria(Device.class);
Disjunction or = Restrictions.disjunction();
for (DeviceType type : DeviceType.values()) {
if (type.isFubar()) {
or.add(Restrictions.eq("typeOfDevice", type));
}
}
criteria.add(or);
return criteria;
除了采用
where typeOfDevice.fubar = true
之外,我们还按照where (typeOfDevice = Mobile OR typeOfDevice = OtherFubar OR typeOfDevice = OtherOtherFubar)
的方式进行处理。我意识到这并不是您最初拍摄的那种单线,但我认为它可以回答所问的问题。