hibernate没有正确构建查询
我的项目是用Spring Boot和Kotlin构建的。
我有一个Message
,可能有一个父消息(当回应消息),代码如下所示:
@Entity class Message( @field: Id @field:GeneratedValue var id : Long = 0, @field: ManyToOne(targetEntity = Employee::class) var sender:Employee?=null, @field: ManyToOne(targetEntity = Employee::class) var receiver:Employee?=null, var time:LocalDateTime, var content: String, var read:Boolean, @field: ManyToOne(targetEntity = Message::class) @Nullable var father:Message?=null) {}
当调用这个查询(使用JpaRepository)时:
fun findByReceiverIdAndReadFalse(id:Long):List
我得到这个错误:
Unknown column 'message0_.father_id' in 'field list'
它实际上应该是message0_.father.id
,而不是father_id
(父亲是消息实体)。
Hibernate构建的完整查询是这样的:
select message0_.id as id1_5_, message0_.content as content2_5_, message0_.father_id as father_i5_5_, message0_.read as read3_5_, message0_.receiver_id as receiver6_5_, message0_.sender_id as sender_i7_5_, message0_.time as time4_5_ from message message0_ left outer join employee employee1_ on message0_.receiver_id=employee1_.id where employee1_.id=? and message0_.read=0
Employee
class级:
@Entity data class Employee( @field: Id @field:GeneratedValue var id : Long = 0, var username : String = "", var password : String ="", var name : String ="", var lastName: String ="", var phone : String="", var email : String ="", var sex : String ="", var active : Boolean = false, @field: ManyToOne(targetEntity = District::class) var district : District? = null, @field: ManyToOne(targetEntity = Company::class) var company : Company? = null, var picture:String="", var resetPasswordCode:String="", // código que se le envía al usuario en el momento que crea // la cuenta, deberá abrir en enlace del correo para activarla // de ahí que "active" sea false. var activationCode : String="", // La fecha en que caduca el código activación: 5 días para activar var activationCodeExpiration : LocalDateTime = LocalDateTime.now().plusDays(5), var enabled : Boolean = true, var accountNonExpired: Boolean = true, var credentialsNonExpired: Boolean = true, var accountNonLocked : Boolean = true, @field: OneToMany(targetEntity = Roles::class) var roles :MutableSet = mutableSetOf()) { fun toUser() : User { val authorities = mutableSetOf() roles.forEach{authorities.add(SimpleGrantedAuthority(it.role))} return User(username,password,enabled,accountNonExpired,credentialsNonExpired,accountNonLocked, authorities) } }
有什么办法强制使用适当的领域? 我错过了什么吗?
问题是在字段father
没有@JoinColumn
注释。 Join列表示JPA中的哪个列(而不是field!)引用了我们当前的实体,而targetEntity说JPA(而且这已经完全过时了),哪个类表示我们当前的字段。