Репозиторий Spring JPA не может разрешить свойство объекта

#spring #hibernate #spring-data-jpa #repository

#spring #впасть в спящий режим #spring-data-jpa #репозиторий

Вопрос:

Я пытаюсь выполнить простой поиск по двум столбцам для таблицы.

Мой класс сущности клиента snipet:

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CUSTOMER_ID", nullable = false)
    private int customer_id;

    @Column(name = "FIRST_NAME", nullable = false)
    private String first_name;

    @Column(name = "LAST_NAME", nullable = false)
    private String last_name;

    @Column(name = "PHONE_NUMBER", nullable = false)
    private String phone_number;

    @Column(name = "EMAIL")
    private String email;
 

мой класс CustomerRepository snipet:

 @Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {

    List<Customer> findAllByFirst_nameAndLast_name(String firstName, String lastname);

}
 

введите описание изображения здесь

При компиляции и запуске SpringBoot я получаю эту ошибку:

 nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.owl.owlserver.repositories.CustomerRepository.findAllByFirst_nameAndLast_name(java.lang.String,java.lang.String)! No property first found for type Customer!
 

Таким образом, он не может обнаружить поля в объекте customer, должен ли я каким-то образом импортировать класс customer в репозиторий?

Ответ №1:

Проблема заключается в вашем соглашении об именовании snake_case, рекомендуется использовать соглашение об именовании camelCase.

Как говорится в документах Spring:

Поскольку мы рассматриваем символ подчеркивания как зарезервированный символ, мы настоятельно рекомендуем следовать стандартным соглашениям об именовании Java (то есть не использовать подчеркивания в именах свойств, а использовать вместо них регистр верблюда).

Вы можете увидеть связанную проблему JIRA здесь — подчеркивания не поддерживаются в именах свойств.

Ответ №2:

Я бы рекомендовал хранить имущество в верблюжьем футляре в соответствии со стандартами

Поскольку мы рассматриваем символ подчеркивания как зарезервированный символ, мы настоятельно рекомендуем следовать стандартным соглашениям об именовании Java (то есть не использовать подчеркивания в именах свойств, а использовать вместо них регистр верблюда).

     @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CUSTOMER_ID", nullable = false)
private int customerId;

@Column(name = "FIRST_NAME", nullable = false)
private String firstName;

@Column(name = "LAST_NAME", nullable = false)
private String lastName;

@Column(name = "PHONE_NUMBER", nullable = false)
private String phoneNumber;

@Column(name = "EMAIL")
private String email;
 

А затем запрос, а также выражения для каждого свойства

 List<Customer> findAllByFirstNameAndLastName(String firstName, String lastname);
 

Ответ №3:

Весь смысл Spring JPA заключается в упрощении построения запросов с использованием методов, определенных в репозитории. Соглашение заключается в использовании camelCase для именования поля в Entity и того же самого при написании методов запроса. Просто измените имена полей сущностей с snake case на camel case, и все готово.