32

我开始学习 JPA,并基于我在 SQL Server 中测试的以下本机 SQL 实现了一个带有 JPA 查询的示例:

SELECT f.StudentID, f.Name, f.Age, f.Class1, f.Class2 
FROM Student f 
    LEFT OUTER JOIN ClassTbl s ON s.ClassID = f.Class1 OR s.ClassID = f.Class2
WHERE s.ClassName = 'abc'

从上面的 SQL 我构造了以下 JPQL 查询:

SELECT f FROM Student f LEFT JOIN f.Class1 s;

如您所见,我仍然缺少OR s.ClassID = f.Class2原始查询中的条件。我的问题是,我怎样才能把它放到我的 JPQL 中?

4

4 回答 4

47

写这个;

 SELECT f from Student f LEFT JOIN f.classTbls s WHERE s.ClassName = 'abc'

因为您的 Student 实体与 ClassTbl 实体具有一对多关系。

于 2012-04-18T04:45:17.403 回答
18

如果您有实体 A 和 B,它们之间没有任何关系,并且每个 A 严格来说有 0 或 1 B,您可以这样做:

select a, (select b from B b where b.joinProperty = a.joinProperty) from A a

这将为您提供单个结果的 Object[]{a,b} 或多个结果的 List<Object[]{a,b}> 。

于 2013-03-21T14:35:06.657 回答
5

通常 ON 子句来自映射的连接列,但 JPA 2.1 草案允许在新的 ON 子句中添加附加条件。

看,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON

于 2012-04-18T13:48:59.723 回答
0

请参见 :

public interface YourDBRepository extends JpaRepository<Employee, Long> {

@Query("select new com.mypackage.myDTO(dep.empCode, dep.empName, em.EmployeeCode, em.EmployeeName) \n" +
        "from Department dep\n" +
        "left join  Employee em\n" +
        "on dep.DepartmentCode = em.DepartmentCode")  // this is JPQL so use classnames
List<myDTO> getDeptEmployeeList();

}

您还可以使用 CrudRepository 并在 PK 表类中包含带有 FK 表类的 @JoinColumn 并具有 List 返回列表,然后执行查找操作以实现相同的目的。

在部门实体类中:

 @OneToMany
@Fetch(FetchMode.JOIN)
@JoinColumn(name="DEPT_CODE")
private List<Employee> employees;

CriteriaBuilder 是另一种选择。

于 2021-08-16T17:40:57.117 回答