2010-09-09 12 views
0

Je suis en train d'accomplir des requêtes ad hoc en utilisant les tables jointes, en utilisant un Restrictions.or et Restrictions.ilikeCritères Hibernate, Rejoint, ou

Mes entités ressemblent:

@Entity 
@Table(name="CASE_REVIEW") 
public class CaseReview { 

    @Id 
    @Column(name = "REVIEW_ID", unique = true, nullable = false, length = 19) 
    private Long reviewId; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "CASE_ID", nullable = false) 
    private Case reviewCase; 

} 

@Entity 
@Table(name = "CASE") 
public class Case { 

    @Id 
    @Column(name = "ID", unique = true, nullable = false, length = 19) 
    private Long id; 

    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="STUDENT_ID" , referencedColumnName="ID", 
    private StudentInformation studentInformation; 

} 

@Entity 
@Table(name="STUDENT") 
public class StudentInformation { 
    @Id 
    @Column(name="ID") 
    private Long id; 

    @Column(name="LAST_NAME") 
    private String lastName; 

    @Column(name="FIRST_NAME") 
    private String firstName; 
} 

Mon code fait quelque chose comme ce qui suit:

Criteria c = session.createCriteria(CaseReview.class); 
c.createAlias("reviewCase" , "reviewCase"); 
c.createAlias("reviewCase.studentInformation" , "reviewCasestudentInformation"); 
c.add(Restrictions.or(Restrictions.ilike("reviewCasestudentInformation.lastName" , "%e%"), Restrictions.ilike("reviewCasestudentInformation.firstName" , "%e"))); 

Je reçois org.hibernate.QueryException: ne pouvait pas résoudre la propriété: reviewCasestudentInformation de: CaseReview. J'ai également essayé de créer des alias à plusieurs niveaux:

c.createAlias("reviewCase.studentInformation" , "reviewCaseStudentInformation"); 

et en utilisant cela dans la restriction ou avec les mêmes résultats. Assez étrangement, l'ensemble des alias fonctionne bien pour

Order.asc("reviewCaseStudentInformation.lastName") 

À peu près à perte. Suggestions?

Répondre

0

Vous devez créer un autre critère - à savoir un sous-critères - comme celui-ci:

Criteria criteraCaseReview = session.createCriteria(CaseReview.class); 
Criteria criteraReviewCase = criteraCaseReview.createCriteria("reviewCase"); 
criteraReviewCase.add(Restrictions.or(Restrictions.ilike("lastName", "%e%"), Restrictions.ilike("firstName", "%e"))); 

PS. Je ne pense pas que cela aide ReviewCase est un champ sur CaseReview ... il rend le code plutôt confus!