У меня есть 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}]
@dan1st, я так думаю
Это недопустимый JSON, поэтому вы не можете получить ответ. Вы можете получить [{"name":"6-PRN.00-00.01"}], а можете получить ["6-PRN.00-00-01"], но не можете получить то, что хотите.




Вы можете транслировать имеющийся у вас список и оставить только 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);
Это работает, но возвращает абсолютно все значения из таблицы. Нет выбора по параметру "устройство"
извините, я забыл, где пункт, я обновил, проверьте еще раз, пожалуйста
Вместо того, чтобы создавать дополнительную нагрузку на вашу базу данных и возвращать всю запись и возможные объединенные/связанные объекты, добавьте специальный запрос, который возвращает только имя.
@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));
}
Можно ли заключить
6-PRN.00-00.01в двойные кавычки?