Необязательные объекты spring boot - получить поля объекта

Я определил сущность клиента

@Entity
@Table(name = "customer")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

и CrudRepository

public interface CustomerRepo extends CrudRepository<Customer, Long> {
}

если я использую метод CustomerRepo.findById для поиска клиента

@Autowired
CustomerRepo repo;

Optional<Customer> dbCustomer = repo.findById(id);

как я могу узнать имя этого клиента. Тогда я не могу использовать геттер. поэтому меня интересует, есть ли какое-либо решение для использования геттеров Optional, или мне нужно использовать другой метод для поиска клиента по идентификатору?

Добавьте в репо метод поиска клиента по идентификатору, а затем вы можете использовать его как этот Customer dbCustomer = repo.findById(id);

Tino M Thomas 03.04.2018 11:53

Я попытался получить «Несовместимые типы. Требуется: com.fitnet.phonqpon.models.Customer Found: java.util.Optional <com.fitnet.phonqpon.models.Customer>» ........ но если я добавлю Клиент findById (длинный идентификатор); внутри интерфейса CustomerRepo я получаю "findById (Long)" в 'com.fitnet.phonqpon.repositories.CustomerRepo' конфликтует с 'findById (ID)' в 'org.springframework.data.repository.CrudRepository'; пытаюсь использовать несовместимый тип возврата "

Ante Ereš 03.04.2018 11:57

Вы можете изменить имя поля своего первичного ключа на customerId или что-то в этом роде и добавить метод в репо, например findByCustomerId(Long id)

Tino M Thomas 03.04.2018 12:06

id - имя поля моего первичного ключа

Ante Ereš 03.04.2018 12:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
4
11 884
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте использовать другой метод поиска Клиента:

@Autowired
CustomerRepo repo;

Customer dbCustomer = repo.findOne(id);
Ответ принят как подходящий

Optional<Customer> возвращается, потому что не гарантируется, что такой клиент с запрошенным идентификатором будет в базе данных. Вместо возврата null это просто означает, что Optional.isPresent() вернет false, если идентификатор не существует.

Согласно документации API (https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#findById-ID-):

Returns:
the entity with the given id or Optional#empty() if none found

Поэтому вы, вероятно, захотите просто использовать методы на Optional, чтобы проверить, содержит ли он клиента (т.е. существует клиент с этим идентификатором), а затем получить такое имя:

Optional<Customer> dbCustomer = repo.findById(id);
if (dbCustomer.isPresent()) {
    Customer existingCustomer = dbCustomer.get();
    String nameWeWanted = existingCustomer.getName();
    //operate on existingCustomer
} else {
    //there is no Customer in the repo with 'id'
}

В качестве альтернативы вы можете попробовать стиль обратного вызова (показанный с помощью Java 8 Lambda):

Optional<Customer> dbCustomer = repo.findById(id);
dbCustomer.ifPresent(existingCustomer -> {
    String nameWeWanted = existingCustomer.getName();
    //operate on existingCustomer
});

Стоит отметить, что можно проверить наличие идентификатора без фактического извлечения / загрузки объекта с помощью метода интерфейса:

boolean CrudRepository.existsById(ID id)

Это экономит нагрузку на сущность, но по-прежнему требует обращения к базе данных.

Спасибо, Томас. Это мне помогло.

Ante Ereš 03.04.2018 12:32

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