У меня есть следующий код:
@Entity
public class StudentEntity {
@Id
private String id;
private Student student;
...
}
public class Student {
private String name;
private List<Grade> grades;
}
public class Grade {
private String className;
private String grade;
}
Я настроил репозиторий Spring Data mongodb и пытаюсь создать метод, который вернет мне List<Student> на основе className, который я передаю в качестве параметра. Основываясь на всем, что я прочитал, я предположил, что следующее будет работать:
public List<Student> findByStudentGradesClassName(final String className);
но это дает ошибку, говорящую, что тип параметра должен быть объектом Grade. Я действительно хочу пройти только в String className.
Это возможно?




Вам нужно будет разделить вложенные поля символом подчеркивания:
public List<Student> findByStudent_Grades_ClassName(final String className);
Обратите внимание, что вам по-прежнему нужно начинать имена полей с прописных букв.
Подчеркивание по-прежнему пригодится, например, если у вас есть отношения X.myName и X.MY.name. Я знаю, что это необычный сценарий, но у меня есть требование дублировать значение как в X, так и в связанном компоненте. Оба будут соответствовать FindByMyName, поэтому возникает ошибка. К счастью, FindByMy_Name работает, как и ожидалось.
Sonarqube не любит символы подчеркивания в имени метода.
@Akash правило всегда можно отключить, оно более читабельно, потому что вы четко видите уровень в своей иерархии
Используя Spring boot 2.1.8 / spring data 2.1.10, я обнаружил, что символы подчеркивания не нужны. Протестировано на вложенном поле @ManyToOne (а не в списке) и с использованием оператора countAll... в репозитории.