Spring boot иерархия таблиц jpa - PullRequest
0 голосов
/ 14 января 2019

У меня есть только одна таблица в базе данных с именем Студент . Ниже сущность jpa против этого в моем коде:

@Entity
@Table(name = "student")
public class Student{

@Id
private Long id;

@Column
private String firstName;

@Column
@Embedded
@JsonUnwrapped
private School school;
}

public class School{

private Integer grade;//eg. 2nd, 3rd

private String type; //eg. primary, secondary
}

До настоящего времени код предназначался только для извлечения всех учащихся и их данных или для извлечения конкретного ученика. Итак, схема БД была такой. Но теперь у нас появилась новая функциональность, в которой нам нужно искать на основе определенной оценки и выбирать всех учащихся для этой конкретной оценки. ИЛИ получить всех учащихся для определенного типа школы, например. все ученики начальной школы Таким образом, требование полностью изменилось, так что нам нужно отправить возвратную схему ниже к внешнему интерфейсу:

class SchoolResponseDTO{

private String schoolType;

private List<Integer> grades;
}

class Grade{

private Integer id;

private List<Integer> studentId;
}

Чтобы быть немного многословным, отныне нам нужно найти все типы школ, затем все оценки в этих типах школ, а затем всех учащихся в этом типе и классе школы.

До сих пор мы использовали Spring JpaRepository для наших требований. Я чувствую, что это новое требование потребует пользовательских запросов, и я не думаю, что это может быть выполнено прямым способом с использованием JPARepository. Мне просто нужно знать, что ты думаешь. Можно ли это сделать без пользовательских SQL-запросов?

1 Ответ

0 голосов
/ 14 января 2019

Вы можете использовать Spring Data и использовать что-то вроде этого выражения свойства запроса. Из документа:

Выражения свойств могут ссылаться только на прямое свойство управляемого объекта, как показано в предыдущем примере. Во время создания запроса вы уже убедитесь, что проанализированное свойство является свойством класса управляемого домена. Однако вы также можете определить ограничения, просматривая вложенные свойства. Рассмотрим следующую сигнатуру метода:

List<Person> findByAddressZipCode(ZipCode zipCode);

Предположим, что у человека есть адрес с ZipCode. В этом случае метод создает свойство traversal x.address.zipCode. Алгоритм разрешения начинается с интерпретации всей части (AddressZipCode) как свойства и проверки класса домена для свойства с этим именем (некапитализированным). Если алгоритм завершается успешно, он использует это свойство. Если нет, алгоритм разделяет источник по частям верблюда с правой стороны на голову и хвост и пытается найти соответствующее свойство - в нашем примере AddressZip и Code. Если алгоритм находит свойство с этой головкой, он берет хвост и продолжает строить дерево оттуда, разделяя хвост в вышеописанном порядке. Если первое разделение не совпадает, алгоритм перемещает точку разделения влево (Address, ZipCode) и продолжает.

Хотя это должно работать в большинстве случаев, алгоритм может выбрать неправильное свойство. Предположим, что класс Person также имеет свойство addressZip. Алгоритм будет соответствовать уже в первом раунде разбиения, выберет неправильное свойство и завершится ошибкой (так как тип addressZip, вероятно, не имеет свойства кода).

Чтобы устранить эту неоднозначность, вы можете использовать _ внутри имени вашего метода для определения точек обхода вручную. Поэтому имя нашего метода будет следующим:

List<Person> findByAddress_ZipCode(ZipCode zipCode);

Поскольку мы рассматриваем символ подчеркивания как зарезервированный символ, мы настоятельно рекомендуем следовать стандартным соглашениям об именах Java (т. Е. Не использовать подчеркивание в именах свойств, а вместо этого использовать регистр верблюда).

Проверьте ссылку https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

Надеюсь, это поможет.

...