Создание Hibernate Критерии, которые могут фильтровать по ссылочной сущности - PullRequest
1 голос
/ 24 апреля 2011

У меня есть сущность (PersonQuestionsEntity), в которой первичным ключом являются PersonEntity и QuestionEntity.Я использую составной ключ, чтобы отразить эту связь.

Теперь я хочу создать объект Criteria, который может выполнять следующие действия: Найти все сущности PersonQuestion для заданного идентификатора вопроса и возраста человека.

Вот моя попытка создать Критерии для этого:

    Session session = getHibernateTemplate().getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(PersonQuestionsEntity.class);
    criteria.add(Restrictions.eq("question.questionId", "87"));
    criteria = criteria.createCriteria("person");
    criteria.add(Restrictions.eq("age", 23));
    criteria.setMaxResults(100);
    List l = criteria.list();

Проблема в том, что я получаю эту ошибку:

Caused by: java.sql.SQLException: ORA-00904: "PERSONENTI1_"."AGE": invalid identifier

В сгенерированном SQL кажется, что на человека ссылаются какPERSONENTI4, а не PERSONENTI1.Если я копирую SQL-код и запускаю его с PERSONENTIT4 вместо PERSONENTI4, он работает (вроде - похоже, он выполняет какое-то декартово соединение).

Любые подсказки относительно того, что я могу делать неправильно?Я очень плохо знаком с использованием Hibernate.

PersonQuestionsEntity

@Entity
@IdClass(com.anonymous.model.PersonQuestionsKey.class)
@Table(name = "PERSON_QUESTIONS")
public class PersonQuestionsEntity implements Serializable
{
    private static final long serialVersionUID = -8254277382097937813L;

    @Id
    @ManyToOne
    @JoinColumn(name = "USER_NAME", nullable = false)
    private PersonEntity person;

    @Id
    @ManyToOne
    @JoinColumn(name = "QUESTION_ID", nullable = false)
    private QuestionEntity question;

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

PersonEntity

@Entity
@Table(name = "PERSON")

public class PersonEntity implements Serializable
{
    private static final long serialVersionUID = -1699435979266209440L;

    @Id
    @Column(name = "USER_NAME", length = 20, nullable = false)
    private String userName;

    @Column(name = "USER_NAME_REAL", length = 20, nullable = false)
    private String userNameReal;

    @Column(name = "AGE", nullable = false)
    private int age;
}

PersonQuestionsKey

   @Embeddable
    public class PersonQuestionsKey implements Serializable
    {
        private static final long serialVersionUID = -264160855961369405L;

        @Id
        @ManyToOne
        @JoinColumn(name = "USER_NAME", nullable = false)
        private PersonEntity person;

        @Id
        @ManyToOne
        @JoinColumn(name = "QUESTION_ID", nullable = false)
        private QuestionEntity question;

}

1 Ответ

0 голосов
/ 24 апреля 2011

Прежде всего, вам не нужны внутренние критерии, просто используйте:

    Criteria criteria = session.createCriteria(PersonQuestionsEntity.class);
    criteria.add(Restrictions.eq("question.questionId", "87"));
    criteria.add(Restrictions.eq("person.age", 23));
    criteria.setMaxResults(100);
    List l = criteria.list();

Второй (в отношении типа объединения), в таких случаях я обычно использую HQL, который производит внутренние объединения,HQL может выглядеть следующим образом:

from PersonQeustionEntity where question.questionId = :questionId 
                                            and person.age = :age

в результате Query объект вы можете установить параметры questionId и age для желаемых входных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...