2013-06-23 4 views
1

J'ai deux entités et une avec un champ d'une énumération spécifique. Maintenant, je veux récupérer tout ce qui a une valeur enum spécifique.Hibernate ne peut pas résoudre le type avec enum

@Entity 
@Table(name = "AlarmEvent") 
@XmlRootElement 
public class AlarmEvent implements Identifiable { 
    @Id 
    @GeneratedValue(generator = "increment") 
    @GenericGenerator(name = "increment", strategy = "guid") 
    @Column(name = "Id", columnDefinition = "uniqueidentifier") 
    private String id; 

    @ManyToOne 
    @JoinColumn(name = "AlarmType_Id") 
    @XmlJavaTypeAdapter(EntityAdapter.class) 
    private AlarmEventDefinition alarmType; 

    @Column(name = "Timestamp", nullable = false) 
    private Date timestamp; 

    @Override 
    @XmlTransient 
    public String getIdentifier() { 
     return id; 
    } 

    public AlarmEventDefinition getAlarmType() { 
     return alarmType; 
    } 

    public void setAlarmType(AlarmEventDefinition alarmType) { 
     this.alarmType = alarmType; 
    } 

    public String getId() { 
     return id; 
    } 

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

    public Date getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(Date timestamp) { 
     this.timestamp = timestamp; 
    } 
} 

et la seconde entité

@Entity 
@Table(name = "AlarmEventDefinition") 
@XmlRootElement 
public class AlarmEventDefinition implements Identifiable { 
    public static enum AlarmEventDefinitionType { 
     Start, End, Trigger, Report 
    } 

    @Id 
    @Column(name = "Id") 
    private Integer id; 

    @Column(name = "Name_DE", length = 256) 
    private String nameDe; 

    @Column(name = "Type") 
    @Enumerated(EnumType.STRING) 
    private AlarmEventDefinitionType type; 

    @OneToMany(mappedBy = "alarmType", fetch = FetchType.LAZY) 
    @XmlTransient 
    private List<AlarmEvent> events; 

    public List<AlarmEvent> getEvents() { 
     return events; 
    } 

    public Integer getId() { 
     return id; 
    } 

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

    public String getNameDe() { 
     return nameDe; 
    } 

    public void setNameDe(String nameDe) { 
     this.nameDe = nameDe; 
    } 

    public AlarmEventDefinitionType getType() { 
     return type; 
    } 

    public void setType(AlarmEventDefinitionType type) { 
     this.type = type; 
    } 
} 

Maintenant, je veux faire

List<AlarmEvent> result = (List<AlarmEvent>) session.createCriteria(AlarmEvent.class) 
     .add(Restrictions.eq("alarmType.type", AlarmEventDefinitionType.Trigger)) 
     .list(); 

Pour récupérer tous AlarmEvents thiers type AlarmEventDefinitions est déclencheur. Mise en veille prolongée dit:

org.hibernate.QueryException: ne pouvait pas résoudre la propriété: alarmType.type de: datamodel.AlarmEvent

Répondre

0

Vous avez juste une propriété alarmType définie dans la classe AlarmEvent, il y a no alarmType.type. C'est le message d'erreur dit. Vous devez étendre les critères à la classe AlarmEventDefinition associée. Le code doit ressembler à ceci:

List<AlarmEvent> result = (List<AlarmEvent>) session.createCriteria(AlarmEvent.class) 
     .createCriteria("alarmType").add(Restrictions.eq("type", AlarmEventDefinitionType.Trigger)) 
     .list(); 
+0

alarmType est l'instance de AlarmEventDefinition. AlarmEventDefinition a un type de champ (l'énumération) alors pourquoi ne devrait-il pas y avoir un type d'alarme? ** Navigation **: AlarmEvent --alarmType -> AlarmEventDefinition --type -> AlarmEventDefinitionType – Coxer

+0

@Coxer. S'il vous plaît voir la réponse mise à jour. – dcernahoschi

+0

voir mon commentaire. Le type de propriété est de la classe AlarmEventDefinition not AlarmEventDefinition ** Type ** – Coxer

Questions connexes