Я пытался использовать Spring Data JPA на Spring Boot и продолжал получать ошибку, я не могу понять, в чем проблема:
Unable to locate Attribute with the the given name [firstName] on this ManagedType [com.example.h2demo.domain.Subscriber]
FirstName объявлен в моем классе сущности. Раньше я использовал класс обслуживания с DAO с другим проектом и работал отлично.
Мой класс Entity (геттеры и сеттеры также входят в класс):
@Entity
public class Subscriber {
@Id @GeneratedValue
private long id;
private String FirstName,LastName,Email;
public Subscriber(long id, String firstName, String lastName, String email) {
this.id = id;
this.FirstName = firstName;
this.LastName = lastName;
this.Email = email;
}
}
...
Мой класс репозитория
@Component
public interface SubscriberRepository extends JpaRepository<Subscriber,Long> {
Subscriber findByFirstName(String FirstName);
Subscriber deleteAllByFirstName(String FirstName);
}
Мой класс обслуживания
@Service
public class SubscriberService {
@Autowired
private SubscriberRepository subscriberRepository;
public Subscriber findByFirstName(String name){
return subscriberRepository.findByFirstName(name);
}
public Subscriber deleteAllByFirstName(String name){
return subscriberRepository.deleteAllByFirstName(name);
}
public void addSubscriber(Subscriber student) {
subscriberRepository.save(student);
}
}
И мой класс контроллера:
@RestController
@RequestMapping("/subscribers")
public class SubscriberController {
@Autowired
private SubscriberService subscriberService;
@GetMapping(value = "/{name}")
public Subscriber findByFirstName(@PathVariable("name") String fname){
return subscriberService.findByFirstName(fname);
}
@PostMapping( value = "/add")
public String insertStudent(@RequestBody final Subscriber subscriber){
subscriberService.addSubscriber(subscriber);
return "Done";
}
}




Попробуйте сменить private String FirstName,LastName,Email; на private String firstName,lastName,email;
Он должен работать.
findByFirstName в SubscriberRepository пытается найти поле firstName по соглашению, которого там нет.
Дополнительная информация о том, как перемещаются свойства внутри сущностей https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions
попробуйте проверить значения перед вызовом addSubscriber
На мой взгляд, принятый ответ должен предлагать метод общей идентификации проблемы; этот ответ - только отладка этого конкретного кода: программное обеспечение парного программирования
Согласно Технические характеристики, имена свойств должны начинаться с малого регистра.
...The resolution algorithm starts with interpreting the entire part (AddressZipCode) as the property and checks the domain class for a property with that name (uncapitalized)....
Он попытается найти недвижимость с названием без заглавных букв. Так что используйте firstName вместо FristName и т. д.
После того, как я изменил свои переменные entity class с заглавной буквы на строчную, например, с Username на username, теперь у меня работает метод Users findByUsername(String username);.
Та же проблема была, когда я имел дело со спецификациями данных Spring (https://www.baeldung.com/rest-api-search-language-spring-data-specifications)
Первоначальный фрагмент кода был:
private Specification<Project> checkCriteriaByProjectNumberLike(projectNumber: String) {
(root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("project_number"), "%" + projectNumber)
}
Проблема была в root.get ("номер_проекта"). Внутри метода мне пришлось указать имя поля, как в модели (projectNumber), но я отправил имя поля, как в базе данных (project_number).
То есть окончательным правильным решением было:
private Specification<Project> checkCriteriaByProjectNumberLike(projectNumber: String) {
(root, query, criteriaBuilder) -> criteriaBuilder.like(root.get("projectNumber"), "%" + projectNumber)
}
Могу я задать еще один вопрос? Отправка JSON POST методу addSubscriber дает нулевые значения для хранения в базе данных. Есть ли ошибка в коде ??