2015-06-14 7 views
1

У меня есть класс DocMovement вроде этого:Hibernate - org.hibernate.QueryException: не удалось разрешить свойство:

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

Класс DocMaster является чем-то вроде этого:

@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(); 

тогда я получаю следующее исключение:

[org.hibernate.QueryException: could not resolve property: 
docMaster.status of: com.fms.persistence.DocMovement] with root cause 
org.hibernate.QueryException: could not resolve property: 
docMaster.status of: com.fms.persistence.DocMovement 

Есть другие случаи, когда я пытаюсь выполнить запрос с использованием критериев, как показано выше, запрос выполняется нормально, но я не могу понять, что я делаю неправильно в этом случае. Я тоже пытался использовать fager fetch, раньше я не использовал псевдоним, поэтому я также попытался использовать псевдоним.

Пожалуйста, помогите мне решить проблему !!!

ответ

4

Попробуйте добавить псевдоним:

criteria.createAlias("documentMovement.docMaster", "docMaster") 

а позже называют

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

это работает, Thanx a lott, но я не понимаю, почему, потому что я не делаю этого, как вы предлагали в других случаях, но он отлично работает. Почему в этом случае я должен был дать псевдоним. –

2

Вы должны добавить псевдоним для docMaster первого

+0

bu t recipientDetail также является объектом другого класса UserDetails, и я повторяю его поле то же самое, почему спящий режим не выбрасывает для него исключение. –

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. –

+0

@FurquanAhmed Вы правы, вам, вероятно, понадобится один. Заметьте, иногда Hibernate анализирует материал «назад» (он в основном создает стек синтаксического анализа). – Taylor

1

Я думаю, что это comparaison с перечислениями, которые не являются правильными. Вы пытаетесь сравнить перечисление со строкой. Эта линия кажется неправильным:

criteria.add(Restrictions.ne("documentMovement.docMaster.status",FMSConstants.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()));