@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,但我不知道如何使用它。
答案 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();