2010-08-02 6 views
1

Mes entités mise en veille prolongée sont les suivantes:Critères Hibernate multiples API rejoint

@Entity 
@Table(name = "EditLocks") 
public class EditLock extends AuditableEntity { 

    /** The document that is checked out. */ 
    @OneToOne 
    @JoinColumn(name = "documentId", nullable = false) 
    private Document document; 

document ressemble alors à ceci:

public class Document extends AuditableEntity { 
    /** Type of the document. */ 
    @ManyToOne 
    @JoinColumn(name = "documentTypeId", nullable = false) 
    private DocumentType documentType; 

Essentiellement, la requête que je veux écrire est:

Select * from EditLocks el, Document docs, DocumentTypes dt where el.documentId = docs.id and docs.documentTypeId = dt.id and dt.id = 'xysz'; 

Comment faire cela avec les critères d'hibernation api?

Répondre

8

Cela devrait le faire:

Criteria criteria = getSession().createCriteria(EditLock.class); 
criteria.createAlias("document", "document"); 
criteria.createAlias("document.documentType", "documentType"); 
criteria.add(Restrictions.eq("documenttype.id", "xyz"); 

Vous devez ajouter des alias pour atteindre l'objet ayant la propriété sur laquelle vous souhaitez interroger.

+0

Ouais, je pensais que j'aurais pu manquer ça n'avait tout simplement pas le moyen de le tester. Merci! –

0

Il semble donc que vous essayez simplement d'obtenir les EditLocks qui ont des Documents avec un DocumentType id = 'xyz'. Je suppose que le document et DocumentType ont standards mappings Hibernate:

Criteria crit = getSession().createCriteria(EditLock.class); 
crit.add(Restrictions.eq("document.documenttype.id", "xyz"); 

Hibernate devrait être en mesure de comprendre les jointures pour vous je pense.

+1

qui ne fonctionne pas: causés par: org.hibernate.QueryException: ne pouvait pas résoudre la propriété: document.documentType.id de: com.docfinity.document.entity.EditLock – Khandelwal