【发布时间】:2018-07-06 23:40:20
【问题描述】:
我的项目是用 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<Message>
我收到此错误:
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类:
@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<Roles> = mutableSetOf())
{
fun toUser() : User
{
val authorities = mutableSetOf<GrantedAuthority>()
roles.forEach{authorities.add(SimpleGrantedAuthority(it.role))}
return
User(username,password,enabled,accountNonExpired,credentialsNonExpired,accountNonLocked, authorities)
}
}
有没有办法强制使用正确的字段? 我错过了什么吗?
【问题讨论】:
-
等等,看起来你用hibernate构建的查询什么都没有,而你的JPQL查询是一个。你确定生成的 SQL 查询是根据这个具体的 JQPL 查询构建的吗?
-
我编辑了查询和结果,感谢您的关注
-
我认为问题在于您没有在
@ManyToOne字段中指定@JoinColumn。但是你能添加Employee类的代码吗? -
我认为你错了。 Join 列表示 JPA 数据库中的哪个列(不是字段!)正在引用我们当前的实体,而 targetEntity 表示 JPA(这对我来说完全过时)哪个类代表我们当前的字段。并且默认是 (surprise-surprise!) 我们字段的类型 )))
-
我已经发布了这个答案。如果您认为是正确的,请随时将其标记为正确 :) 欢迎!
标签: spring-boot kotlin spring-data-jpa