Spring boot 如何通过kotlin和Spring data JPA中不在另一类@OneToMany单向映射中的列获取数据

Spring boot 如何通过kotlin和Spring data JPA中不在另一类@OneToMany单向映射中的列获取数据,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,单向映射fun-findByPincode(pincode:Int):List工作正常,因为这在我的数据类中,但当我试图通过编写自定义函数(如fun-findByCustomerId(customerId:Int))来获取数据时,List不工作。我过去从事双向映射的工作。我错过什么了吗?我的数据类、存储库和控制器如下 @Entity data class Customer(@Id @GeneratedValue var id: Long, var firs

单向映射
fun-findByPincode(pincode:Int):List
工作正常,因为这在我的数据类中,但当我试图通过编写自定义函数(如
fun-findByCustomerId(customerId:Int))来获取数据时,List
不工作。我过去从事双向映射的工作。我错过什么了吗?我的数据类、存储库和控制器如下

@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)
当我在上面添加行时,我得到以下错误

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)
@实体
数据类客户(@Id@GeneratedValue变量Id:Long,
var firstName:String,
var lastName:String,
电话:很长,
var email:String,
@OneToMany@JoinColumn(name=“customer\u id”)@Column(nullable=true)变量地址:列表?)
@实体
数据类地址(@Id@GeneratedValue变量Id:Long,
华尔街:字符串,
var城市:字符串,
地区:字符串,
变量状态:字符串,
var pincode:Int,
@manytone(fetch=FetchType.LAZY)@JsonIgnore var customer:customer)
似乎只有一种工作方式,即双向映射

创建名为“addressRepository”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:未能为方法public abstract java.util.List com.example.repository.AddressRepository.findByCustomerId(int)创建查询!找不到类型地址的属性customerId

问题是Address实体类中没有像
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)

你好,我想我无法正确解释。当我有单向映射时,我正在尝试获取数据。这意味着我之前所做的映射是在我用来添加映射注释的两个实体类中进行的,而在另一个类中,我必须将@JsonIgnore放在一边。使用客户实体进行的映射将使其成为双向映射,并且将在json结果中进行链接。我得到以下错误:嵌套异常是org.hibernate.DuplicateMappingException:表[address]包含由多个逻辑列名[customer\u id]、[customerId]引用的物理列名[customer\u id]当我添加地址类var customerId:Int时。我是否需要添加类并从两侧进行绑定注释?@VIKASROY除非明确定义该变量,否则无法使存储库方法可行。我认为您应该在地址实体中添加一个字段
customerId
,比如
@Column(name=“Customer\u id”)var costomerId:Int
——这意味着您不必定义Customer类本身,这应该避免json链接。但这将在数据库中创建两个Customer\u id列。
@Entity
data class Address(@Id @GeneratedValue var id: Long,
               var street: String,
               var city: String,
               var district: String,
               var state: String,
               var pincode: Int)
@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)