在Hibernate Criteria API中查询enum方法

时间:2011-09-12 13:25:48

标签: hibernate spring enums

我有一个@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();

2 个答案:

答案 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)。我意识到这不是你最初拍摄的单行,但我认为它回答了问题。