У меня есть ответ сущности, который имеет составной идентификатор AnswerId, который имеет и сущность Person, и сущность Вопроса, которые имеют строковые идентификаторы personId и questionId соответственно.Кроме того, сущность Вопрос имеет поле questionText.
Если я попытаюсь что-то вроде:
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, и сгенерированный SQL показывает, почему:
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?Я попытался добавить псевдоним, такой как
criteria.createAlias("answerId.question", "q");
criteria.add(Restrictions.like("q.questionText", "%" + text + "%"));
, но это, похоже, не работает.Может ли кто-нибудь оказать некоторую помощь в том, что я делаю неправильно?
Редактировать: Странная вещь в том, что у сущности Person также есть набор Ответов, так что я могу выполнить запрос к Персоне и отфильтровать с помощьюограничение вроде "answers.answerId.question.questionText"
и оно действительно работает.Я не уверен, что отличается.
Редактировать: Мои сущности (без getters / setters / equals / 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;
}