我有一个@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
的<{1}}实体?
typeOfDevice.isFubar() == true
没有做好以下工作:
return factory.getCurrentSession().createCriteria(Device.class).
add(Restrictions.eq("typeOfDevice.isFubar", true)).list();
答案 0 :(得分:5)
您已将其分配为
@Enumerated(EnumType.STRING)
这将存储枚举的名称。您的db列将具有“MOBILE”或“EMAIL”,但不具有“true”或“false”。您可以将查询更改为
return factory.getCurrentSession().createCriteria(Device.class).
add(Restrictions.eq("typeOfDevice", DeviceType.MOBILE)).list();
它更可靠吗?
答案 1 :(得分:4)
似乎解决问题的方法可能是:
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)
。我意识到这不是你最初拍摄的单行,但我认为它回答了问题。