首页 > 解决方案 > 具有嵌套查询和 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) 验证失败!

所以我需要帮助来修复查询。

标签: javapostgresqlspring-boothibernatejpql

解决方案


我对 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);

推荐阅读