Java JPA通过查询连接表

Java JPA通过查询连接表,java,mysql,sql,jpa,orm,Java,Mysql,Sql,Jpa,Orm,我有个奇怪的问题。我想创建如下数据库: 一个学生可以有很多科目。学生对一门学科有一次评估。所以我有 带ID、姓名、姓氏和身份证的班级学生,如: @Id @GeneratedValue long id_student; 在学科课上,我有: @Id @GeneratedValue long id_subject; String name; double graduate 我有三个班,名为StudentWithGraduate: @Id @GeneratedValu

我有个奇怪的问题。我想创建如下数据库: 一个学生可以有很多科目。学生对一门学科有一次评估。所以我有 带ID、姓名、姓氏和身份证的班级学生,如:

@Id
@GeneratedValue
long id_student;
在学科课上,我有:

    @Id
    @GeneratedValue
    long id_subject;
    String name;
double graduate
我有三个班,名为StudentWithGraduate:

@Id
@GeneratedValue
long id;
double evaluation;
@OneToOne
Student student;
@OneToOne
Subject subject;
我想我可以做得更好,但我不知道怎么做。但这不是主要问题。这,我写的是工作,但我想在查询中做一些连接,如:

Vector<Object[]>  v = (Vector<Object[]>) em.createQuery(
"select p.name, o.graduate from Student s 
left join StudentWithGraduate o on s.id_student=o.student
left join Subject p on p.id_subject=o.subject where
s.surname='"+name+"'").getResultList();
Vector v=(Vector)em.createQuery(
“选择p.name,o.graduate from Student s
在s.id\U student=o.student上与毕业生o左联合
左连接主体p on p.id_Subject=o.Subject,其中
s、 姓氏=“+name+”)。getResultList();
它抛出了一个错误: 异常说明:对象比较只能与OneToOneMappings一起使用。其他映射比较必须通过查询键或直接属性级比较来完成

如何更改此DB方案或更改该查询

对不起我的英语

另外,当我进行研究时,我发现了@joinTables,但我不知道如何使用它。

您需要一个,但我将尝试快速解释一些缺失的部分:

在JPQL查询中,您不需要编写哪些是
JOIN
条件(即expresions上的
),而是从一个实体开始在实体图中导航(下面我从
StudentWithGraduate
实体开始):

“:name”被称为命名参数,它可以帮助您重新命名。要为其设置值,请编写以下命令:

Query query = em.createQuery(aboveQuery);
query.setParameter("name", parameterValue);
//....the rest of parameters + getResultList();
您需要一份详细的报告,但我将尝试快速解释一些缺失的部分:

在JPQL查询中,您不需要编写哪些是
JOIN
条件(即
expresions上的
),而是从一个实体开始在实体图中导航(下面我从
StudentWithGraduate
实体开始):

“:name”被称为命名参数,它可以帮助您重新命名。要为其设置值,请编写以下命令:

Query query = em.createQuery(aboveQuery);
query.setParameter("name", parameterValue);
//....the rest of parameters + getResultList();
您需要一份详细的报告,但我将尝试快速解释一些缺失的部分:

在JPQL查询中,您不需要编写哪些是
JOIN
条件(即
expresions上的
),而是从一个实体开始在实体图中导航(下面我从
StudentWithGraduate
实体开始):

“:name”被称为命名参数,它可以帮助您重新命名。要为其设置值,请编写以下命令:

Query query = em.createQuery(aboveQuery);
query.setParameter("name", parameterValue);
//....the rest of parameters + getResultList();
您需要一份详细的报告,但我将尝试快速解释一些缺失的部分:

在JPQL查询中,您不需要编写哪些是
JOIN
条件(即
expresions上的
),而是从一个实体开始在实体图中导航(下面我从
StudentWithGraduate
实体开始):

“:name”被称为命名参数,它可以帮助您重新命名。要为其设置值,请编写以下命令:

Query query = em.createQuery(aboveQuery);
query.setParameter("name", parameterValue);
//....the rest of parameters + getResultList();

它起作用了。我不知道怎么做,但我会读这一页:)如果我还有其他问题,我会问:)它起作用了。我不知道怎么做,但我会读这一页:)如果我还有其他问题,我会问:)它起作用了。我不知道怎么做,但我会读这一页:)如果我还有其他问题,我会问:)它起作用了。我不知道怎么做,但我会读这一页:)如果我还有其他问题,我会问:)