Данные Spring, поиск по свойству вложенного объекта

У меня есть следующий код:

@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.

Это возможно?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
29
0
33 695
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно будет разделить вложенные поля символом подчеркивания:

public List<Student> findByStudent_Grades_ClassName(final String className);

Обратите внимание, что вам по-прежнему нужно начинать имена полей с прописных букв.

Используя Spring boot 2.1.8 / spring data 2.1.10, я обнаружил, что символы подчеркивания не нужны. Протестировано на вложенном поле @ManyToOne (а не в списке) и с использованием оператора countAll... в репозитории.

BitfullByte 15.10.2019 12:27

Подчеркивание по-прежнему пригодится, например, если у вас есть отношения X.myName и X.MY.name. Я знаю, что это необычный сценарий, но у меня есть требование дублировать значение как в X, так и в связанном компоненте. Оба будут соответствовать FindByMyName, поэтому возникает ошибка. К счастью, FindByMy_Name работает, как и ожидалось.

Antoniossss 23.10.2019 19:09

Sonarqube не любит символы подчеркивания в имени метода.

Akash 16.09.2020 13:41

@Akash правило всегда можно отключить, оно более читабельно, потому что вы четко видите уровень в своей иерархии

Andronicus 16.09.2020 14:12

Другие вопросы по теме