JPA通过查询连接表

时间:2013-11-29 15:04:24

标签: java mysql sql jpa orm

我有奇怪的问题。我想创建这样的数据库: 一个学生可以有很多科目。学生对一个科目进行一次评估。所以我有 具有ID,姓名,姓氏和A_I 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();

它引发了一个错误: 异常描述:对象比较只能与OneToOneMappings一起使用。其他映射比较必须通过查询键或直接属性级别比较来完成。

如何更改此数据库方案或更改该查询?

抱歉我的英文。

PS。当我做研究时,我发现了@joinTables,但我不知道如何使用它。

1 个答案:

答案 0 :(得分:3)

您需要一个short introduction in JPQL,但我会尝试快速解释一些缺失部分:

在JPQL查询中,您执行 not 写入JOIN条件(即ON表达式),而是导航您的实体图,从实体(下面我以StudentWithGraduate实体开头):

SELECT p.name, o.graduate FROM StudentWithGraduate o
    LEFT JOIN o.student s
    LEFT JOIN o.subject p
    WHERE s.surname=:name

“:name”被称为命名参数,它可以再次帮助SQL injections。要为其设置值,请编写以下内容:

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