Spring Data JPA Не удалось найти атрибут с заданным именем

Я пытался использовать 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";
    }

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

Ответы 4

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

Попробуйте сменить 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

Могу я задать еще один вопрос? Отправка JSON POST методу addSubscriber дает нулевые значения для хранения в базе данных. Есть ли ошибка в коде ??

smned 16.03.2018 12:48

попробуйте проверить значения перед вызовом addSubscriber

harsh 16.03.2018 13:48

На мой взгляд, принятый ответ должен предлагать метод общей идентификации проблемы; этот ответ - только отладка этого конкретного кода: программное обеспечение парного программирования

lrkwz 20.12.2020 17:51

Согласно Технические характеристики, имена свойств должны начинаться с малого регистра.

...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)
}

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