Запрос метода enum в Hiberate Criteria API - PullRequest
3 голосов
/ 12 сентября 2011

У меня есть @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();

Ответы [ 2 ]

5 голосов
/ 12 сентября 2011

Вы аннотировали его как

@Enumerated(EnumType.STRING)

это будет хранить имя перечисления. Ваш столбец БД будет иметь либо «MOBILE», либо «EMAIL», но не «true» или «false». Вы можете изменить свой запрос на

 return factory.getCurrentSession().createCriteria(Device.class).
   add(Restrictions.eq("typeOfDevice", DeviceType.MOBILE)).list();

Это более правдоподобно?

4 голосов
/ 19 сентября 2013

Похоже, что решение вашей проблемы может быть таким:

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). Я понимаю, что это был не тот лайнер, для которого вы изначально снимали, но я думаю, что он отвечает на вопрос в том виде, в котором он был задан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...