HQL/JPQL 带有嵌套查询和 UUID 数组字段的查询

HQL/JPQL query with nested query and UUID array field

我需要有关 HQL/JPQL 查询的帮助 Java Spring 使用 Hibernate 和 Postgresql 数据库启动项目。

主要实体是 StudentLesson(为简洁起见,省略了额外的字段和注释)。

学生

持久实体:

@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;

}

DB table:

create table student
(
    id         uuid,
    lesson_id  uuid
);

Lesson 可以是不同 lesson cycles 的一部分,它们存储在 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;

}

DB table:

create table lesson
(
    id               uuid,
    name             varchar(1000),
    lesson_cycle_ids uuid[]
);

我需要一个方法List<Student> getStudents(UUID lessonCycleId),其中 returns 个学生列表,这些学生链接到具有提供的 lessonCycleId 的课程。

现在我在 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);

但它不起作用。我在应用程序启动时遇到以下错误:

Validation failed for query for method 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);