Java 创建可按引用实体筛选的休眠条件

Java 创建可按引用实体筛选的休眠条件,java,hibernate,persistence,criteria,Java,Hibernate,Persistence,Criteria,我有一个实体(PersonQuestionSenty),它的主键是PersonEntity和QuestionEntity。我使用复合键来反映这种关系 现在,我想创建一个Criteria对象,它可以执行以下操作:查找给定questionId和个人年龄的所有PersonQuestion实体 以下是我试图为此创建标准的尝试: Session session = getHibernateTemplate().getSessionFactory().openSession(); Crite

我有一个实体(PersonQuestionSenty),它的主键是PersonEntity和QuestionEntity。我使用复合键来反映这种关系

现在,我想创建一个Criteria对象,它可以执行以下操作:查找给定questionId和个人年龄的所有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非常陌生

人格意识

@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;
}
人格

@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;
}
个人问题

   @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;

}

首先,您不需要真正的内部标准,只需使用:

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(); 条件=session.createCriteria(PersonQuestionSenty.class); 标准。添加(限制条件、情商(“问题、问题ID”、“87”); 标准。增加(限制。情商(“人。年龄”,23)); 标准:setMaxResults(100); List l=标准。List(); 其次(关于连接类型),在这种情况下,我通常使用产生内部连接的HQL。HQL可能如下所示:

from PersonQeustionEntity where question.questionId = :questionId and person.age = :age 来自PersonQeustionEntity,其中question.questionId=:questionId 和person.age=:年龄
在结果
Query
对象中,您可以将参数
questionId
age
设置为所需的输入。

首先,您不需要内部标准,只需使用:

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(); 条件=session.createCriteria(PersonQuestionSenty.class); 标准。添加(限制条件、情商(“问题、问题ID”、“87”); 标准。增加(限制。情商(“人。年龄”,23)); 标准:setMaxResults(100); List l=标准。List(); 其次(关于连接类型),在这种情况下,我通常使用产生内部连接的HQL。HQL可能如下所示:

from PersonQeustionEntity where question.questionId = :questionId and person.age = :age 来自PersonQeustionEntity,其中question.questionId=:questionId 和person.age=:年龄
在结果
Query
对象中,您可以将参数
questionId
age
设置为所需的输入。

我想使用条件,因为我想为过滤结果提供许多不同的选项(真实的个人属性比这个缩短的字段有更多的字段)。此外,我尝试了您在我第一次启动时显示的代码,但它不起作用。我收到以下错误:org.hibernate.QueryException:无法解析属性:person.age of:com.anonymous.model.PersonQuestionSenty。我想知道我对复合键的使用是否弄乱了什么?如果你只使用问号标准,它是否正常工作?您编写的错误看起来您的实体映射确实存在问题,但我不能确定这是因为您正在使用的复合键。如果我只使用questionId条件,它确实可以正常工作。回家后我必须仔细检查一下,但我认为这个人的用户名标准也适用。createCriteria从5.2开始就不推荐了。是否有任何替代方案几乎与此处显示的方案一样干净?手册中显示的方法相当难看……我想使用标准,因为我想为过滤结果提供许多不同的选项(真实的人比这个缩短的人有更多的字段)。此外,我尝试了您在我第一次启动时显示的代码,但它不起作用。我收到以下错误:org.hibernate.QueryException:无法解析属性:person.age of:com.anonymous.model.PersonQuestionSenty。我想知道我对复合键的使用是否弄乱了什么?如果你只使用问号标准,它是否正常工作?您编写的错误看起来您的实体映射确实存在问题,但我不能确定这是因为您正在使用的复合键。如果我只使用questionId条件,它确实可以正常工作。回家后我必须仔细检查一下,但我认为这个人的用户名标准也适用。createCriteria从5.2开始就不推荐了。是否有任何替代方案几乎与此处显示的方案一样干净?手册中显示的方法相当难看……你是如何解决这个问题的?@MikhailBatcer,我真的不记得了。今晚或明天我会检查代码,看看是否能弄清楚我做了什么——已经有一段时间了,这只是一个业余爱好。你是如何解决这个问题的?@MikhailBatcer,我真的不记得了。我将在今晚或明天检查代码,看看是否能弄清楚我做了什么——已经有一段时间了,这只是一个爱好项目。