2015-01-14 2 views
0

Имея этот класс домена и использовать спящий режим 3.2.6 интегрирован с JPA под пружиной 3.2.4Вызванные: org.hibernate.QueryException: не может разрешить свойство из внутреннего класса перечислений

@Entity 
public class PriorityDeviceKeyword { 

    public enum PriorityDeviceKey { 

     ALL  ("ALL", "ALL DEVICES"), 
     IOS  ("IOS", "IOS"), 
     ANDROID ("ANDROID","ANDROID"); 

     private final String name; 

     private final String id; 

     private PriorityDeviceKey(String name, String id) { 
      this.name = name; 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public String getId() { 
      return id; 
     } 
    } 

    @Id 
    private Long id; 

    @Column(name = "key") 
    private PriorityDeviceKey key; 


    @ManyToMany 
    @JoinTable(name = "t_priority_device_set", joinColumns = @JoinColumn(name = "priority_device__id", referencedColumnName = "id")) 
    private List<PriorityDevice> priorityDevices; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public PriorityDeviceKey getKey() { 
     return key; 
    } 

    public void setKey(PriorityDeviceKey key) { 
     this.key = key; 
    } 

    public List<PriorityDevice> getPriorityDevices() { 
     return priorityDevices; 
    } 

    public void setPriorityDevices(List<PriorityDevice> priorityDevices) { 
     this.priorityDevices = priorityDevices; 
    } 
} 

При выполнении этого запроса, у меня есть ниже метода в моем классе DAO, что я выполнить

@Override 
    @SuppressWarnings("unchecked") 
    public Set<PriorityDevices> findPriorityAreas(PriorityDevicesKey key) { 

     String jpql = "from PriorityDevices as pak where pak.key.name = :keyName"; 

     Query query = entityManager.createQuery(jpql); 
     query.setParameter("keyName", key.getName());  
     List<PriorityDevices> priorityDevices = query.getResultList(); 
     return new HashSet<PriorityDevices>(priorityDevices); 
    } 

Я получаю это исключение, брошенное приложение:

2015-01-14 13:14:50,936 ERROR [com.controller.errors.Error500Controller] - Application thrown an exception 
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: name of: com.domain.PriorityDevicesKeyword [from com.domain.PriorityDevicesKeyword as 
     at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:624) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:96) 
     at sun.reflect.GeneratedMethodAccessor440.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 

ответ

1

Подумайте эти изменения могут работать для вас:

@Column(name = "key") 
@Enumerated(EnumType.STRING) 
private PriorityAreaKey key; 

и

String jpql = "from PriorityAreaKeyword as pak where pak.key = :keyName"; 
Query query = entityManager.createQuery(jpql); 
query.setParameter("keyName", key); 
+0

Вам не нужно добавлять '@Enumerated (EnumType.STRING)'. Он только сообщает db о том, как следует перечислять перечисление. При этом: хранилище по умолчанию - по порядку, поэтому следует позаботиться только о добавлении новых перечислений после существующих. При сохранении в виде строки только изменения в имени проблематичны, а изменения в порядке - нет. – mpkorstanje

1

Hibernate магазины перечислений как oridnal. Или, когда поле аннотируется @Enumerated(EnumType.STRING), как строка с коротким именем Enum. При аннотированных действительных именах будет {ALL, IOS, ANDROID}. В любом случае существует только одно поле, свойства самого перечисления не сохраняются, они постоянны в конце концов.

Если вы хотите запросить значение перечисления, вам нужно запросить pak.key = :key и использовать в качестве параметра key. Hibernate выполнит требуемый перевод в порядковый номер или строку.

Смежные вопросы