#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, и все готово.