У меня есть сущность (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;
}