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;
}
ドメインクラス定義を投稿できますか? –
@MikeSicklerが追加されました。 – AHungerArtist
PersonEntityを削除するには、その制限なしで失敗する可能性があります。 – AHungerArtist