【发布时间】:2021-10-26 01:28:17
【问题描述】:
我正在我的应用程序中实施高级搜索。我对 Oracle 和 JPA 有点陌生。数据库结构与包含 StudentID 和 CourseID 的中间表具有多对多关系 (ERD)。
我正在尝试返回具有班级/课程列表的学生行。
基本上,我想要的结果
SELECT DISTINCT s.* FROM STUDENT s
INNER JOIN STUDENT_COURSE sc ON s.StudentID = sc.StudentID
INNER JOIN COURSE c ON c.CourseID = sc.CourseID
WHERE ( c.CourseID IN (SELECT DISTINCT CourseID FROM STUDENT_COURSE WHERE CourseID = 'A01') AND c.CourseID IN (SELECT DISTINCT CourseID FROM STUDENT_COURSE WHERE CourseID = 'A02'));
返回同时拥有“A01”和“A02”课程的学生的记录。
| ID | Age | Grade |
|---|---|---|
| 1 | ... | ... |
| 4 | ... | .... |
| 9 | ... | .... |
有课程
| Courses |
|---|
| A01,A02 |
| A01,A02,A03,X02 |
| A01, A02, A03 |
目标是使用 Spring Data JPA 获得类似的结果。并使选择任意数量的课程 ID 更加通用。
我试过了
@Query(value="SELECT DISTINCT s.* FROM STUDENT s "
+"INNER JOIN STUDENT_COURSE sc ON s.StudentID = sc.StudentID "
+"INNER JOIN COURSE c ON c.CourseID = sc.CourseID "
+"WHERE ( s.STUDENTID IN (SELECT DISTINCT STUDENTID FROM STUDENT_COURSE WHERE CourseID =:courseIds)",nativeQuery=true))
public List<Student> advancedSearch(@Param("courseIds") String courseIds);
一个例子, courseIds 字段包含“A01,A02”。结果将为空。
我查看了人们使用 IN 的示例。当我尝试它时,它会返回学生有课程AO1 OR A02 OR Both的记录。
不想要这个
| ID | Age | Grade |
|---|---|---|
| 2 | ... | ... |
| 3 | ... | .... |
| 8 | ... | .... |
有课程
| CourseID |
|---|
| A01,A03 |
| A01, X01 |
| A02 |
我想要同时具有 A01 AND A02 的学生记录,如另一表所示。
【问题讨论】:
-
您发布的查询似乎没有返回您所说的结果。查询中没有任何内容将
courses聚合为逗号分隔的字符串,并且两个in子句不会限制您所说的它们会限制的数据。 -
我创建了一个字符串函数,该函数将从数组字段中收集课程编号并将其转换为逗号分隔的字符串。查询的结果将导致一个空的选定结果,不存在任何记录。
-
这个“字符串函数”是您希望在查询中调用的 Oracle 中用户定义的聚合函数吗?还是您调用的 Java 函数并希望查询为每门课程返回一行(您的查询当前根本不返回任何课程信息)?而且你的
in子句没有意义——它们之间没有相关性,所以你想看看是否有学生上过特定的课程。 -
如果您想要一个查询来返回所有参加过这两门课程的学生,我们当然可以提供帮助。当您所说的查询无法生成您想要的表格或您在问题文本中要求的结果时,很难提供帮助。
-
这是一个 Java 函数。基本上,我希望查询返回学生根据第一个表参加了两门课程的记录。我想要一个更通用的查询,它可以包含多门课程(A01、A02、...)并返回参加过这两门课程的学生记录,而不是像 in 子句中的一门或另一门或两者都参加过的学生记录
标签: sql spring oracle jpa spring-data-jpa