具有嵌套查询和 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 查询方面的帮助。

主要实体是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;


数据库表:

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&lt;Student&gt; 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 列中查询具有异构元素的嵌套数组

具有多个字段的嵌套 AND 和 OR 的 CAML 查询

具有深度嵌套数组循环的 SQL 查询 OpenJson

具有嵌套字段类型条件的 Apollo graphql 查询

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

查询没有数组的嵌套字段