Как вернуть поля в Spring Boot, которых нет в модели?

#java #spring #spring-boot #spring-data #hibernate-mapping

#java #spring #spring-boot #spring-данные #спящий режим-отображение

Вопрос:

Итак, у меня есть вариант использования, когда я хочу вернуть определенный атрибут для всех строк таблицы. Но атрибут не существует в таблице. Это должно быть сгенерировано на лету.

Например — Таблица с именем Student — имеет следующий атрибут * ID * Name

Теперь, когда я использую репозиторий для этого класса модели, я хочу вернуть все строки данных, включая ID и Name , но также добавить другое свойство, вызываемое URL вместе с каждой строкой. Таким образом, вывод будет —

  • ID
  • Имя
  • URL

Данные для URL могут быть сгенерированы «на лету» — скажем = "example.com/" ID

Как мне поступить?

Та же модель / репозиторий / класс обслуживания для этого объекта следующие —

Объект Student

 @Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class StudentDetail {

            @Id
            private Long ID;
            private String Name; 

    }
  

Репозиторий

 @Repository
public interface StudentDetail  extends JpaRepository<StudentDetail , Integer> {

}
  

Обслуживание

 @Override
    public List<StudentDetail> getStudentDetails() {
        List<StudentDetail> studentDetail = studentDetailsRepository.findAll();
        return studentDetail;
    }
  

Служба вернет все строки только с атрибутом ID и Name . Как мне вычислить параметр URL в репозитории?

Ответ №1:

Вы можете добавить временное поле (это означает, что оно не будет сопоставлено ни с одним столбцом и сохранено):

 public class StudentDetail {

        @Id
        private Long ID;
        private String Name;
        @Transient
        private String url = // Here comes your implementation

}
  

Комментарии:

1. 1. Вернет ли вызов службы значение URL, поскольку оно не сохраняется? 2. Возможно ли переместить эту логику URL в уровень репозитория вместо самой сущности?

2. 1. Да, это будет возвращено, а не сохранено, 2. возможно, но я не уверен, как это сделать, и репозиторий предназначен не для этого, если вы действительно не хотите, чтобы это было в entity, вы могли бы сопоставить entity с DTO в @Service

3. Итак, свойство url отображается, но оно не может добавить к нему идентификатор . URL определяется как — private String url =»example.com » ИДЕНТИФИКАТОР. Я также пробовал использовать ссылку «this». Однако идентификатор отображается как NULL

4. Возможно, вам потребуется использовать @PostConstruct

5. Потрясающе. Спасибо. Просто примечание — Поскольку я использую @PostConstruct, мне приходится вручную определять средство получения для параметра URL и внутри него определять его значение. Преимущества lombok теряются из-за этого свойства