【问题标题】:Querying on enum's method in Hiberate Criteria API在 Hibernate Criteria API 中查询枚举方法
【发布时间】:2011-09-12 13:25:48
【问题描述】:

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

如何查询具有typeOfDevice.isFubar() == trueDevice 实体?

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();

【问题讨论】:

    标签: hibernate spring enums


    【解决方案1】:

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

    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)。我知道这不是您最初拍摄的单线,但我认为它回答了所提出的问题。

    【讨论】:

      【解决方案2】:

      您已将其注释为

      @Enumerated(EnumType.STRING)
      

      这将存储枚举的名称。您的 db 列将包含“MOBILE”或“EMAIL”,但不是“true”或“false”。您可以将查询更改为

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

      它更可靠不是吗?

      【讨论】:

      • 是的。确实如此。不幸的是,这不是我想要的。我不想查询 typeOfDevice;我想查询 isFubar() ...
      • 你不能那样做,fubar信息没有存储在db中,hibernate无法理解。
      • 这就是问题所在:hibernate 无法映射回条件内的枚举。我想也许有办法实现这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2019-02-05
      相关资源
      最近更新 更多