2011-12-10 11 views
0

personIdとquestionIdという文字列IDを持つ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=? 

がどのように回答と質問の間の結合でください:それはなぜquestionTextと生成されたSQLを示して見つけることができないと言いますか?

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

などのエイリアスを追加しようとしましたが、動作しないようです。誰かが私が間違っていることについて何らかの援助を提供することができますか?

編集:変わったことは、Personエンティティにも、私がPersonとFilterについてのクエリを"answers.answerId.question.questionText"のような制限を使って行うことができるようなAnswersのセットがあり、実際に動作するということです。私は何が違うか分かりません。

編集:私のエンティティ(ゲッター/セッターなし/の/ etc等しい)

@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

関連する問題