Как вернуть значения только одного параметра в GetMapping?

У меня есть API. Как вернуть значения только одного столбца (имя) из базы данных? Код запроса в контроллере:

@RestController
public class PURController {
    @Autowired
    private PURRepository purRepository;
@CrossOrigin()
    @GetMapping("/purs/getname/{device}")
    public ResponseEntity<ArrayList<PUR>> getPurName(@PathVariable(value = "device") String device){
         ArrayList<PUR> pur = purRepository.findAllByDevice(device);
        return ResponseEntity.ok().body(pur);
    }

В этом случае возвращаются все строки, найденные по полю «устройство». Также у меня есть метод в PUR.java:

public String getName() {
        return name;
    }

Как это все может быть связано?

Также: мой класс репозитория:

@Repository
public interface PURRepository extends JpaRepository<PUR, Long> {
    ArrayList<PUR> findAllByDevice(String device);
    Optional<PUR> findByDevice(String device);}

Ответ сейчас:

[{"id":48,"name":"6-PRN.00-00.01","quantity":3,"device":"6-PRN.01-01.000"},{"id":49,"name":"6-PRN.00-00.02","quantity":7,"device":"6-PRN.01-01.000"},{"id":50,"name":"6-PRN.00-00.03","quantity":4,"device":"6-PRN.01-01.000"}]

Ответ я хочу:

[{6-PRN.00-00.01},{6-PRN.00-00.02},{6-PRN.00-00.03}]

Можно ли заключить 6-PRN.00-00.01 в двойные кавычки?

dan1st 20.04.2023 07:25

@dan1st, я так думаю

EloneTheBeige 20.04.2023 07:31

Это недопустимый JSON, поэтому вы не можете получить ответ. Вы можете получить [{"name":"6-PRN.00-00.01"}], а можете получить ["6-PRN.00-00-01"], но не можете получить то, что хотите.

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

Ответы 3

Вы можете транслировать имеющийся у вас список и оставить только pur.name строки:

ArrayList<PUR> pur = purRepository.findAllByDevice(device);
List<String> purNames = pur.stream.map(p -> p.getName()).toList();
return ResponseEntity.ok().body(purNames);

отредактировано: другие ответы также верны, purRepository.findAllDeviceNames будет более эффективным, потому что вы получите меньше данных из базы данных.

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

Вам не нужно использовать поток. Вы можете решить это легко:

  @Query(value = "SELECT p.name FROM PUR p where p.device= :device", nativeQuery = true)
  List<String> findAllNamesByDevice(@Param("device") String device);

Это работает, но возвращает абсолютно все значения из таблицы. Нет выбора по параметру "устройство"

EloneTheBeige 20.04.2023 08:31

извините, я забыл, где пункт, я обновил, проверьте еще раз, пожалуйста

gurkan 20.04.2023 08:32

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

@Repository
public interface PURRepository extends JpaRepository<PUR, Long> {
    @Query("select p.name from PUR p where PUR.deviceId == ?1")
    ArrayList<String> findAllDeviceNames(String device);

Затем:

public ResponseEntity<ArrayList<PUR>> getPurName(@PathVariable(value = "device") String device){
    return ResponseEntity.ok(purRepository.findAllDeviceNames(device));
}

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