在Hiberate Criteria API中查询enum的方法

chz*_*gla 3 enums spring hibernate

我有一个映射到它@Entity@Enumerated字段:

@Entity
@Table
public class Device implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    @Enumerated(EnumType.STRING)
    private DeviceType typeOfDevice;

    [....]

}
Run Code Online (Sandbox Code Playgroud)

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我如何查询Device具有typeOfDevice.isFubar() == true哪些实体?

return factory.getCurrentSession().createCriteria(Device.class).
       add(Restrictions.eq("typeOfDevice.isFubar", true)).list();
Run Code Online (Sandbox Code Playgroud)

是不是做这个工作:

return factory.getCurrentSession().createCriteria(Device.class).
       createCriteria("typeOfDevice").add(Restrictions.eq("fubar", true)).list();
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 6

似乎您的问题的解决方案可能是:

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;
Run Code Online (Sandbox Code Playgroud)

where typeOfDevice.fubar = true我们没有做,而是更接近于where (typeOfDevice = Mobile OR typeOfDevice = OtherFubar OR typeOfDevice = OtherOtherFubar)。我意识到这不是您最初拍摄的单线,但我认为它回答了所问的问题。


kal*_*yan 5

你已经把它作为

@Enumerated(EnumType.STRING)
Run Code Online (Sandbox Code Playgroud)

这将存储枚举的名称.您的db列将具有"MOBILE"或"EMAIL",但不具有"true"或"false".您可以将查询更改为

 return factory.getCurrentSession().createCriteria(Device.class).
   add(Restrictions.eq("typeOfDevice", DeviceType.MOBILE)).list();
Run Code Online (Sandbox Code Playgroud)

它更可靠的不是?