【问题标题】:JPA 2.0 NamedQuery Left JoinJPA 2.0 NamedQuery 左连接
【发布时间】:2016-07-07 02:39:13
【问题描述】:

我有两张表 Departments, Teachers,如下所示:

Departments     Teachers
---             ---   
D_ID            T_ID
Code            Name
                Dept (logically reference D_ID)

由于 Teachers 中的一些旧记录,包含无效的 Dept 值,例如,Dept = 5 的教师,但 Departments 中没有 D_ID = 5。

在 SQL 中,我可以使用 SELECT t.*, COALESCE(d.Code, t.Dept) as Dept FROM Teachers t LEFT JOIN Departments d ON d.D_ID = t.Dept 得到预期的结果,但我不确定如何在 JPA 中使用 LEFT JOIN,并将结果作为教师实体返回。

我已经定义了 Teachers 实体和 Departments 实体,但由于旧记录,我不确定是否应该在 Teachers 或 Departments 实体中定义 @OneToOne / @OneToMany / @ManyToOne 关系。

class Teachers
String T_ID;
String Name;
String Dept;
@Transient 
String DeptCode;

class Departments
String D_ID;
String Code;

我是使用 JPA 的初学者,我正在使用 JPA 2.0 与 SpringDataJPA 和 Hibernate。

请提供一些帮助。

【问题讨论】:

    标签: hibernate jpa-2.0 spring-data-jpa


    【解决方案1】:

    您可以在存储库接口中使用 namedQuery,并在教师类中定义一个构造函数,并在查询中使用它来返回您想要的结果。假设 Teachers 是包 main.ct 你可以这样做:

    @Query("SELECT new main.ct.Teachers(t.T_ID, t.Name, t.Dept, COALESCE(d.Code, t.Dept)) FROM Teachers t LEFT JOIN Departments d WHERE d.D_ID = t.Dept")
       List<Teachers> findAllTeachers();
    

    并定义构造函数:

    public Teachers(String id, String name, String dept, String deptCode)
    {
       this.T_ID = id;
       this.Name = name;
       this.Dept = dept;
       this.DeptCode = deptCode;
    }
    

    如果您还没有为教师定义存储库接口,请这样做:

    @Repository
    public interface TeachersRepo extends JpaRepository<Teachers, String>{
    //write here your query
    }
    

    或者你可以在你的实体中使用注释@NamedQuery做同样的事情 如此链接中所述:

    http://www.objectdb.com/java/jpa/query/named

    【讨论】:

    • 我试过但失败了。我得到了以下异常。是版本问题吗?我正在使用 Hibernate 4.2.21 原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:在第 1 行附近打开
    • 我觉得不是版本问题,试试把on条件去掉,放到WHERE子句里。我编辑了答案。就我而言,它可以工作,但我只是发现不建议在 hql 中使用 JOIN ON,就像在这个链接中解释的那样:stackoverflow.com/questions/12003430/…
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多