Java Hibernate-org.Hibernate.QueryException:无法解析属性:

Java Hibernate-org.Hibernate.QueryException:无法解析属性:,java,hibernate,criteria,many-to-one,Java,Hibernate,Criteria,Many To One,我有一个类似这样的班级: @Entity @Table(name = "DOC_MVMNT") public class DocMovement { @Id @GeneratedValue @Column(name = "MVMNT_ID") private int mvmnt_id; @ManyToOne @JoinColumn(name = "BARCOD

我有一个类似这样的班级:

    @Entity
    @Table(name = "DOC_MVMNT")
    public class DocMovement {        
        @Id
        @GeneratedValue
        @Column(name = "MVMNT_ID")
        private int mvmnt_id;

        @ManyToOne
        @JoinColumn(name = "BARCODE")
        public DocMaster docMaster;
    // other fields and getters setters
    }
@Entity 
@Table(name="DOC_MASTER")
public class DocMaster {    
    @Id
    @NotNull
    @Column(name = "BARCODE")
    private String barcode;

    @Column(name = "DOC_NO")
    private String docNo ;

    @Column(name="DOC_TYPE")
    private String docType;

    @Column(name="STATUS")
    private String status;
// other fields and getters setters
}
DocMaster类是这样的:

    @Entity
    @Table(name = "DOC_MVMNT")
    public class DocMovement {        
        @Id
        @GeneratedValue
        @Column(name = "MVMNT_ID")
        private int mvmnt_id;

        @ManyToOne
        @JoinColumn(name = "BARCODE")
        public DocMaster docMaster;
    // other fields and getters setters
    }
@Entity 
@Table(name="DOC_MASTER")
public class DocMaster {    
    @Id
    @NotNull
    @Column(name = "BARCODE")
    private String barcode;

    @Column(name = "DOC_NO")
    private String docNo ;

    @Column(name="DOC_TYPE")
    private String docType;

    @Column(name="STATUS")
    private String status;
// other fields and getters setters
}
当我尝试运行以下代码时:

Criteria criteria = session.createCriteria(DocMovement.class,"documentMovement");
        criteria.add(Restrictions.eq("documentMovement.recipientDetail.empId", empId));
        criteria.add(Restrictions.eq("documentMovement.isCurrent", true));
        criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.CLOSED_STATUS));
        criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.DISPOSED_STATUS));
        List<DocMovement> documentsHeld = (List<DocMovement>) criteria.list();
在其他情况下,我尝试使用如上所示的条件进行查询,查询运行良好,但我无法理解在这种情况下我做错了什么。我也尝试过使用eager fetch,之前我没有使用别名,所以我也尝试过使用别名


请帮我解决这个问题

您必须首先向docMaster添加别名

您必须首先向docMaster添加别名

我认为与枚举的比较是不正确的。您正在尝试将枚举与字符串进行比较。这句话似乎错了:

criteria.add(Restrictions.ne(“documentMovement.docMaster.status”,FMSContents.CLOSED_status))

由于
documentMovement.docMaster.status
定义为字符串,请尝试:

criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.CLOSED_STATUS.toString()));
criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.DISPOSED_STATUS.toString()));

我认为这是与枚举的比较不正确。您正在尝试将枚举与字符串进行比较。这句话似乎错了:

criteria.add(Restrictions.ne(“documentMovement.docMaster.status”,FMSContents.CLOSED_status))

由于
documentMovement.docMaster.status
定义为字符串,请尝试:

criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.CLOSED_STATUS.toString()));
criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.DISPOSED_STATUS.toString()));
尝试添加别名:

criteria.createAlias("documentMovement.docMaster", "docMaster")
稍后再打电话

 criteria.add(Restrictions.ne("docMaster.status",FMSConstants.CLOSED_STATUS));
尝试添加别名:

criteria.createAlias("documentMovement.docMaster", "docMaster")
稍后再打电话

 criteria.add(Restrictions.ne("docMaster.status",FMSConstants.CLOSED_STATUS));

但是recipientDetail也是另一个类UserDetails的对象,我同样引用了它的字段,为什么hibernate没有为此抛出异常。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@FurquanAhmed您是对的,您可能需要一条评论。注意,有时候Hibernate“向后”解析东西(它基本上构建了一个解析堆栈)。@HarshalPatil,它确实提供了一个答案,尽管它没有太多细节。接受的答案是一样的,只是更多的细节(不反对接受,这当然更清楚)。但是recipientDetail也是另一个类UserDetails的对象,我同样引用了它的字段,为什么hibernate没有为此抛出异常。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@FurquanAhmed您是对的,您可能需要一条评论。注意,有时候Hibernate“向后”解析东西(它基本上构建了一个解析堆栈)。@HarshalPatil,它确实提供了一个答案,尽管它没有太多细节。被接受的答案是一样的,只是更多的细节(不反对被接受,这当然更清楚)。这很有效,但我不明白为什么,因为我没有像你在其他情况下建议的那样做,但效果很好。为什么在这种情况下,我必须给出一个别名。这很有效,但我不明白为什么,因为我没有像你在其他情况下建议的那样做,但效果很好。为什么在这种情况下,我必须给出一个别名。