Как получить данные по столбцу, которого нет в другом классе однонаправленного отображения @OneToMany в kotlin и Spring Data JPA - PullRequest
1 голос
/ 18 января 2020

однонаправленное отображение fun findByPincode(pincode: Int) : List<Address> работает нормально, так как это в моем классе данных, но когда я пытаюсь получить данные, написав пользовательскую функцию, такую ​​как fun findByCustomerId(customerId: Int) : List<Address> не работает. Я работал в двухстороннем картографировании. Я что-то здесь скучаю? Мой класс данных, репозиторий и контроллер следующие.

@Entity
data class Customer(@Id @GeneratedValue var id: Long,
                    var firstName: String,
                    var lastName: String,
                    var phone: Long,
                    var email: String,
                    @OneToMany @JoinColumn(name = "customer_id") @Column(nullable = true) var address: List<Address>?)

@Entity
data class Address(@Id @GeneratedValue var id: Long,
                   var street: String,
                   var city: String,
                   var district: String,
                   var state: String,
                   var pincode: Int)
interface AddressRepository: JpaRepository<Address, Long> {

    fun findByPincode(pincode: Int) : List<Address>
    fun findByCustomerId(customerId: Int) : List<Address>// This Line is causing following error
}
@RestController
class CustomerController(@Autowired private val customerRepository: CustomerRepository) {
    @GetMapping("/api/v1/customers")
    fun getCustomers() = customerRepository.findAll()

    @PostMapping("/api/v1/customers")
    fun saveCustomer(@RequestBody customer: Customer) = customerRepository.save(customer)
}

Когда я добавляю строку выше, я получаю следующую ошибку

Error creating bean with name 'addressRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.example.repository.AddressRepository.findByCustomerId(int)! No property customerId found for type Address!

Адрес контроллера

@RestController
class AddressController(@Autowired private var addressRepository: AddressRepository) {

    @GetMapping("/api/v1/{cid}/address")
    fun getAddressByUserId(@PathVariable cid: Int) = addressRepository.findByPincode(cid)

}

Редактировать 1: Рабочий код Но возможно ли это сделать из одностороннего отображения ??

@Entity
data class Customer(@Id @GeneratedValue var id: Long,
                    var firstName: String,
                    var lastName: String,
                    var phone: Long,
                    var email: String,
                    @OneToMany @JoinColumn(name = "customer_id") @Column(nullable = true) var address: List<Address>?)

@Entity
data class Address(@Id @GeneratedValue var id: Long,
                   var street: String,
                   var city: String,
                   var district: String,
                   var state: String,
                   var pincode: Int,
                   @ManyToOne(fetch = FetchType.LAZY) @JsonIgnore var customer: Customer)

Кажется, есть только один способ работы, который одновременно отображение пути.

1 Ответ

1 голос
/ 18 января 2020

Ошибка создания бина с именем addressRepository: сбой вызова метода init; вложенное исключение: java .lang.IllegalArgumentException: не удалось создать запрос для метода publi c abstract java .util.List com.example.repository.AddressRepository.findByCustomerId (int)! Не найдено свойство customerId для типа Address!

ПРОБЛЕМА состоит в том, что в классе Address Entity нет такого свойства, как customerId, и вы определяете метод репозитория как findByCustomerId.

@Entity
data class Address(@Id @GeneratedValue var id: Long,
               var street: String,
               var city: String,
               var district: String,
               var state: String,
               var pincode: Int)

Попробуйте ввести поле cusotmerId в объекте адреса и сопоставить с объектом клиента, которое должно решить вашу проблему, и заметить, что у вас есть поле pincode, и у вас нет проблемы при определении хранилища. метод для этого.

@Entity
data class Address(@Id @GeneratedValue var id: Long,
               var street: String,
               var city: String,
               var district: String,
               var state: String,
               var pincode: Int,
               @Column(name = "customer_id") var customerId: Int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...