【问题标题】:JPA join tables through queryJPA 通过查询连接表
【发布时间】:2013-11-29 23:46:36
【问题描述】:

我有一个奇怪的问题。我想创建这样的数据库: 一个学生可以有很多科目。学生对一门学科进行一次评估。所以我有 具有 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 一起使用。其他映射比较必须通过查询键或直接属性级别比较来完成。

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

对不起我的英语。

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

【问题讨论】:

    标签: java mysql sql jpa orm


    【解决方案1】:

    你需要short introduction in JPQL,但我会尽量快速解释一些缺失的部分:

    在 JPQL 查询中,您写出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();
    

    【讨论】:

    • 它工作正常。我不知道怎么做,但我会读这个页面:)如果我还有其他问题我会问:)
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2022-11-11
    • 2019-01-26
    • 2016-08-06
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多