Я определил сущность клиента
@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, или мне нужно использовать другой метод для поиска клиента по идентификатору?
Я попытался получить «Несовместимые типы. Требуется: 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'; пытаюсь использовать несовместимый тип возврата "
Вы можете изменить имя поля своего первичного ключа на customerId или что-то в этом роде и добавить метод в репо, например findByCustomerId(Long id)
id - имя поля моего первичного ключа




Попробуйте использовать другой метод поиска Клиента:
@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)
Это экономит нагрузку на сущность, но по-прежнему требует обращения к базе данных.
Спасибо, Томас. Это мне помогло.
Добавьте в репо метод поиска клиента по идентификатору, а затем вы можете использовать его как этот
Customer dbCustomer = repo.findById(id);