JPA 2.0 NamedQuery Left Join

时间:2016-07-07 02:39:14

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

我有两个表部门,教师,如下所示:

$.Ajax

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

在SQL中,我可以使用 Departments Teachers --- --- D_ID T_ID Code Name Dept (logically reference D_ID) 获取预期结果,但我不确定如何使用LEFT JOIN在JPA中执行,并将结果作为Teachers实体返回。

我已经定义了教师实体和部门实体,但由于旧记录,我不确定是否应该在教师或部门实体中定义SELECT t.*, COALESCE(d.Code, t.Dept) as Dept FROM Teachers t LEFT JOIN Departments d ON d.D_ID = t.Dept关系。

@OneToOne / @OneToMany / @ManyToOne

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

请给予一些帮助。

1 个答案:

答案 0 :(得分:0)

您可以在存储库接口中使用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