2011-12-10 4 views
0

personId 및 questionId 문자열 ids가 각각있는 Person 엔티티 및 Question 엔티티가있는 복합 ID AnswerId가있는 엔티티 응답이 있습니다. 또한 Question 엔터티에는 questionText 필드가 있습니다.HIbernate Criteria 앨리어싱 결합하지 않음

Criteria criteria = session.createCriteria(AnswerEntity.class); 
criteria.add(Restrictions.eq("answerId.person.personId", personId)); 
criteria.add(Restrictions.eq("answerId.question.questionId", questionId)); 

그것은 그것이 제공 personId 및 questionId을 기준으로 결과를 필터링 점에서 작동 : 내가 좋아하는 뭔가를하려고하면

.

그러나, 나는 시도하는 경우 :

Criteria criteria = session.createCriteria(AnswerEntity.class); 
criteria.add(Restrictions.eq("answerId.person.personId", personId)); 
criteria.add(Restrictions.like("answerId.question.questionText",questionText)); 

실패합니다. 내가 questionText에 액세스 할 수 있도록

SELECT this_.PERSON_ID AS PERSON6_5_0_, 
    this_.QUESTION_ID AS QUESTION5_5_0_, 
    this_.THEIR_ANSWER AS THEIR3_5_0_, 
FROM ANSWER this_ 
WHERE q1_.QUESTION_TEXT LIKE ? 
AND this_.PERSON_ID=? 

가 어떻게 A는 대답과 질문 사이에 가입 않습니다 : 그것은 왜 questionText 및 생성 된 SQL을 보여줍니다 찾을 수 없다고? 나는

criteria.createAlias("answerId.question", "q"); 
criteria.add(Restrictions.like("q.questionText", "%" + text + "%")); 

같은 별명을 추가하는 시도했지만 그 작동하지 않습니다. 누구든지 내가 뭘 잘못하고 있는지에 관해 도움을 줄 수 있습니까?

편집 : 이상한 점은 Person 엔티티에도 Answers 세트가 있기 때문에 "answers.answerId.question.questionText"과 같은 제한을 사용하여 Person 및 필터에 대한 쿼리를 수행 할 수 있으며 실제로 작동합니다. 나는 무엇이 다른지 잘 모르겠습니다.

편집 : 내 엔티티 (게터/세터없이/동일/등)

@Entity 
@Table(name = "ANSWER") 
public class AnswerEntity implements Serializable 
{ 
    private static final long serialVersionUID = -8254277382097937813L; 

    @EmbeddedId 
    private AnswerId answerId; 

    @Column(name = "THEIR_ANSWER") 
    private int theirAnswer; 
} 

@Embeddable 
public class AnswerId implements Serializable 
{ 
    private static final long serialVersionUID = 7025913625856563058L; 

    @OneToOne 
    @Index(name = "ANSWER_QUESTION_ID_INDEX") 
    @JoinColumn(name = "QUESTION_ID") 
    @ForeignKey(name = "FKA1_QUESTION_ID") 
    private QuestionEntity question; 

    @ManyToOne 
    @Cascade(CascadeType.ALL) 
    @Index(name = "ANSWER_PERSON_ID_INDEX") 
    @JoinColumn(name = "PERSON_ID") 
    @ForeignKey(name = "FKA2_PERSON_ID") 
    private PersonEntity person; 
} 

@Entity 
@Table(name = "QUESTION") 
public class QuestionEntity implements Serializable 
{ 
    private static final long serialVersionUID = -3083000088157555984L; 

    @Id 
    @Column(name = "QUESTION_ID", nullable = false) 
    private String questionId; 

    @Index(name = "QUESTION_TEXT_INDEX") 
    @Column(name = "QUESTION_TEXT", length = 4000, nullable = false) 
    private String questionText; 
} 
+0

도메인 클래스 정의를 게시 할 수 있습니까? –

+0

@MikeSickler가 추가되었습니다. – AHungerArtist

+0

PersonEntity는 그 제약없이 실패 할 수 있으므로 제거 할 수 있습니다. – AHungerArtist

답변

1

그냥 추측은, 시도 :

criteria.createAlias("question.questionText", "qText"); 
criteria.add(Restrictions.like("answerId.qText", "%" + text + "%")); 

편집 :이 뒤에 추론 (야생를 만들기 위해 짐작할 수 있겠지만) 별칭 또는 SubCriteria이 필요하지 않으므로 myEembedded.myProperty과 같은 포함 된 속성으로 이동해야합니다. myRelatedEntity.myProperty과 같은 관련 엔터티의 속성으로 이동하려면 별칭 또는 SubCriteria이 필요합니다.

+0

슬프게도, 이것은 효과가 없었지만, 시도하지 않은 것이 었습니다. 나는 단지 HQL을 사용할 것이라고 생각한다. – AHungerArtist

관련 문제