具有嵌套查询和 UUID 数组字段的 HQL/JPQL 查询
Posted
技术标签:
【中文标题】具有嵌套查询和 UUID 数组字段的 HQL/JPQL 查询【英文标题】:HQL/JPQL query with nested query and UUID array field 【发布时间】:2021-12-04 06:50:16 【问题描述】:我需要在 Java Spring Boot 项目中使用 Hibernate 和 Postgresql 数据库进行 HQL/JPQL 查询方面的帮助。
主要实体是Student和Lesson(为简洁起见,省略了额外的字段和注释)。
学生
持久实体:
@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) 的查询验证失败!
所以我需要帮助来修复查询。
【问题讨论】:
试试这个查询,select s from student s where s.lesson in (select les FROM Lesson les where les.lessonCycleId = :lessonCycleId)
@VenkateshK 这是一个课程周期ID(实体中的列表和数据库中的数组),而不是单个值
【参考方案1】:
我对 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);
【讨论】:
以上是关于具有嵌套查询和 UUID 数组字段的 HQL/JPQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PostgreSQL JSONB 列中查询具有异构元素的嵌套数组