2014-09-29 2 views
2

Мне нужно получить данные из базы данных по типу перечисления. я следующее перечисление:hibernate query by enum type

public enum ShopType { 
    VANS("VANS"), ATTICUS("ATTICUS"), FAMOUS("FAMOUS") 

    ShopType(String label) { 
     this.label = label; 
    } 

    private String label; 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 
} 

В моем классе DAO у меня есть метод, который возвращает список объектов по выбранному типу на jsp странице. На странице jsp я отправляю выбранное значение, например String, правильно?

Вот как выглядит мой метод

@Transactional 
public List<Shop> findByType(String type) { 
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ..... .list(); 
} 

Я не знаю, как создать правильный запрос. Enum i хранит в моей базе данных как tinyint.

Описание модели.

@Column(name = "type") 
@Enumerated(EnumType.ORDINAL) 
private ShopType type; 

ответ

4

Как вы установили свой enum как порядковый номер, тогда в запросе вы должны использовать порядковый номер. Пример;

@Transactional 
public List<Shop> findByType(String type) { 
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).ordinal()).list(); 
} 

Если вы измените @Enumerated(EnumType.STRING), то ваш запрос будет выглядеть;

@Transactional 
public List<Shop> findByType(String type) { 
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=" + ShopType.valueOf(type).name()).list(); 
} 

ShopType.valueOf(type), Это будет работать только если тип строка совпадает с именем перечислений. Также, если ваш ярлык совпадает с именем перечисления, вам не нужна метка. ShopType.VANS.name() равно "VANS" и name() метод окончательный, вы можете быть уверены, что его нельзя переопределить.

+0

результат должны зависит от типа пар, который принимает метод findByType, вы просто жёстко типа VANS – user3127896

+0

отредактирован несколько минут назад :) –

+0

выглядит лучше, спасибо =) – user3127896

4

Просто преобразовать строки в Enum и использовать именованный параметр запроса

@Transactional 
public List<Shop> findByType(String type) { 
    ShopType enumType = shopTypeFromString(type); 
    return sessionFactory.getCurrentSession().createQuery("from Shop where type=:p_type") 
     .setParameter("p_type", enumType).list(); 
} 

private ShopType shopTypeFromString(String type) { 
    // You can implement this convertion in your own way 
    return ShopType.valueOf(type); 
} 
+0

Я предполагаю, что это не приятно =) – user3127896