HIbernate Criteria Aliasing не присоединяется - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть ответ сущности, который имеет составной идентификатор 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;
}

1 Ответ

1 голос
/ 11 декабря 2011

Просто дикое предположение, попробуйте:

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

Редактировать: причина этого (чтобы сделать дикое предположение обоснованным;) состоит в том, что вам не нужен псевдоним или SubCriteria дляперейдите к встроенным свойствам, таким как myEembedded.myProperty.Вам нужен псевдоним или SubCriteria, однако, чтобы перейти к свойствам связанной сущности, такой как myRelatedEntity.myProperty.

...