java - 具有嵌套查询和 UUID 数组字段的 HQL/JPQL 查询
问题描述
我需要使用 Hibernate 和 Postgresql 数据库在 Java Spring Boot 项目中的 HQL/JPQL 查询方面的帮助。
主要实体是学生和课程(为简洁起见,省略了额外的字段和注释)。
学生
持久实体:
@Entity
@Table(name = "student")
public class Student {
@Id
@Column(name = "id")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "lesson_id")
private Lesson lesson;
}
数据库表:
create table student
(
id uuid,
lesson_id uuid
);
课程可以是不同课程周期的一部分,它们存储在数据库中的uuid[]文件中。
持久实体:
@Entity
@Table(name = "lesson")
@TypeDefs({
@TypeDef(
name = "uuid-array",
typeClass = UUIDArrayType.class
)
})
public class Lesson {
@Id
@Column(name = "id")
private UUID id;
@Column(name = "name")
private String name;
@Type(type = "uuid-array")
@Column(
name = "lesson_cycle_ids",
columnDefinition = "uuid[]"
)
private List<UUID> lessonCycleIds;
}
数据库表:
create table lesson
(
id uuid,
name varchar(1000),
lesson_cycle_ids uuid[]
);
我需要一个List<Student> getStudents(UUID lessonCycleId)
返回学生列表的方法,这些学生列表链接到带有提供的课程周期 ID 的课程。
现在我在 JPA 存储库中使用了以下方法:
@Query("FROM Student s WHERE s.lesson IN (SELECT les FROM Lesson les WHERE :id MEMBER OF les.lessonCycleIds)")
List<Student> getStudents(@Param("id") UUID lessonCycleId);
但它不起作用。应用启动时出现以下错误:
查询方法 public abstract java.util.List ... StudentJpaRepository.getStudents(java.util.UUID) 验证失败!
所以我需要帮助来修复查询。
解决方案
我对 JPQL 没有运气,所以最后我决定改用本机 Postgresql 查询:
@Query(nativeQuery = true, value = "select * from student where lesson_id IN (select id from lesson where :id = ANY (lesson_cycle_ids))")
List<Student> getStudents(@NonNull @Param("id") UUID lessonCycleId);
推荐阅读
- vue.js - 不要在设置状态数组的突变处理程序错误之外改变 vuex 存储状态
- node.js - 需要('name')()与需要('name');
- haskell - 是否可以使用例如 unsafeCoerce 引入额外的约束?
- python - barh with plot :无法在辅助 x 轴上获得不同的数据比例
- apache-nifi - 如何处理 Nifi 中的嵌套双引号?
- docker - 通过特定接口将所有传入和传出流量路由到/从 Docker 容器
- neural-network - CNN 使用一层过拟合
- android - 如何从房间数据库中检索单个对象?
- r - 如何在 R 代码中使用 sas 宏变量
- node.js - 如何使用 node.js 更新 firestore 中的嵌套字段?