Почему @OrderBy генерирует ошибку?
Столкнулся с крайне любопытным феноменом, хочу обратить внимание опытных джавистов. Делаю приложение на Spring Boot, база данных PostgreSQL.
Модель:
Абстрактный класс AbstractNamedEntity:
@MappedSuperclass
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public abstract class AbstractNamedEntity extends AbstractBaseEntity {
@NotBlank
@Size(min = 2, max = 100)
@Column(name = "name")
protected String name;
}
от него наследуется Theme:
@Entity
@Table(name = "themes")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Theme extends AbstractNamedEntity {
// некоторые поля
}
который в свою очередь является полем в классе Program:
@Entity
@Table(name = "programs")
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
public class Program extends AbstractBaseEntity {
@NotNull
@ManyToOne
@JoinColumn(name = "student_id")
private StudentDetails student;
@NotNull
@ManyToOne
@JoinColumn(name = "theme_id")
private Theme theme;
// другие поля
}
и последний класс StudentDetails, связанный с Program отношением OneToMany:
@NamedEntityGraph(
name = "student-graph-available-tests",
attributeNodes = {
@NamedAttributeNode(value = "programs", subgraph = "programs-subgraph"),
@NamedAttributeNode("availableThemesForTests")
},
subgraphs = {
@NamedSubgraph(
name = "programs-subgraph",
attributeNodes = {
@NamedAttributeNode(value = "open", subgraph = "open-subgraph")
}),
@NamedSubgraph(
name = "open-subgraph",
attributeNodes = {
@NamedAttributeNode("paragraph")
})
})
@Entity
@Table(name = "student_details")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class StudentDetails extends RegionNamedUserDetails {
@OneToMany(mappedBy = "student")
@OrderBy("theme.name")
private Set<Program> programs;
// другие поля
}
Насколько можно видеть, при вытаскивании StudentDetails я использую NamedEntityGraph, который генерирует вот такой запрос (вся суть в предпоследней строчке):
select
studentdet0_.id as id1_11_0_,
programs1_.id as id1_6_1_,
open2_.id as id1_4_2_,
paragraph3_.id as id1_5_3_,
theme5_.id as id1_17_4_,
studentdet0_.user_id as user_id8_11_0_,
studentdet0_.name as name2_11_0_,
studentdet0_.patronymic as patronym3_11_0_,
studentdet0_.surname as surname4_11_0_,
studentdet0_.region_id as region_i9_11_0_,
studentdet0_.graduation as graduati5_11_0_,
studentdet0_.is_distance_learning_allowed as is_dista6_11_0_,
studentdet0_.tel_num as tel_num7_11_0_,
programs1_.is_active as is_activ2_6_1_,
programs1_.student_id as student_4_6_1_,
programs1_.target as target3_6_1_,
programs1_.theme_id as theme_id5_6_1_,
programs1_.tutor_id as tutor_id6_6_1_,
programs1_.student_id as student_4_6_0__,
programs1_.id as id1_6_0__,
open2_.paragraph_id as paragrap3_4_2_,
open2_.program_id as program_4_4_2_,
open2_.sort_num as sort_num2_4_2_,
open2_.program_id as program_4_4_1__,
open2_.id as id1_4_1__,
paragraph3_.name as name2_5_3_,
paragraph3_.graduation as graduati3_5_3_,
paragraph3_.num_of_tests_for_themes_tests as num_of_t4_5_3_,
paragraph3_.theme_id as theme_id5_5_3_,
theme5_.name as name2_17_4_,
theme5_.min_graduation as min_grad3_17_4_,
availablet4_.student_details_id as student_1_12_2__,
availablet4_.theme_id as theme_id2_12_2__
from
student_details studentdet0_
left outer join
programs programs1_
on studentdet0_.id=programs1_.student_id
left outer join
open_paragraphs open2_
on programs1_.id=open2_.program_id
left outer join
paragraphs paragraph3_
on open2_.paragraph_id=paragraph3_.id
left outer join
students_available_themes_for_tests availablet4_
on studentdet0_.id=availablet4_.student_details_id
left outer join
themes theme5_
on availablet4_.theme_id=theme5_.id
where
studentdet0_.id=?
order by
programs1_.theme.name,
open2_.sort_num
Видите, в StudentDetails я отметил поле programs аннотацией @OrderBy("theme.name"), чтобы программы сортировались, эта сортировка видна в предпоследней строке запроса.
Этот запрос генерировал следующую ошибку: org.postgresql.util.PSQLException: ОШИБКА: таблица "theme" отсутствует в предложении FROM. При том, что таблицы theme у меня нигде нет, есть только themes. В итоге я догадался убрать аннотацию @OrderBy("theme.name") и ошибка исчезла, запрос стал работать.
Вопрос: а что мне с этим делать? Мне нужна эта сортировка. Почему из-за неё возникает ошибка и как её решить?
Ответы (1 шт):
В @OrderBy нельзя использовать вложенные свойства
Ошибка возникала из-за того что я использовал в аннотации @OrderBy в классе StudentDetails вложенное свойство: "theme.name". Так делать нельзя, это приведёт к ошибке. Изменить такое поведение невозможно, поэтому сортировку необходимо либо реализовать другим способом, либо не делать её по вложенному свойству вообще.