2013-06-23 32 views
1

我有两个实体和一个具有特定枚举字段的实体。现在我想检索具有特定枚举值的所有内容。休眠不能使用枚举解析类型

@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; 
    } 
} 

和第二实体

@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; 
    } 
} 

现在,我想这样做

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

检索所有AlarmEvents梯也尔AlarmEventDefinitions类型是触发。 休眠说:

org.hibernate.QueryException:无法解析属性: alarmType.type的:datamodel.AlarmEvent

回答

0

你只需要在AlarmEvent类中定义的alarmType财产,有没有alarmType.type。这是错误消息说的。

您需要将标准扩展到关联的类AlarmEventDefinition。代码应该是这样的:

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

alarmType是AlarmEventDefinition的实例。 AlarmEventDefinition有一个字段类型(枚举),所以为什么不应该有一个alarmType.type? **导航**:AlarmEvent --alarmType - > AlarmEventDefinition --type - > AlarmEventDefinitionType – Coxer

+0

@Coxer。请参阅最新的答案。 – dcernahoschi

+0

看到我的评论。属性类型属于类AlarmEventDefinition而不是AlarmEventDefinition **类型** – Coxer