HQL/JPQL 带有嵌套查询和 UUID 数组字段的查询
HQL/JPQL query with nested query and UUID array field
我需要有关 HQL/JPQL 查询的帮助 Java Spring 使用 Hibernate 和 Postgresql 数据库启动项目。
主要实体是 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;
}
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);
我需要有关 HQL/JPQL 查询的帮助 Java Spring 使用 Hibernate 和 Postgresql 数据库启动项目。
主要实体是 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;
}
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);