【问题标题】:Hibernate not properly building the queryHibernate 没有正确构建查询
【发布时间】: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


【解决方案1】:

问题是father 字段上没有@JoinColumn 注释。 Join 列表示 JPA 在 DB 中的哪一列(不是字段!)正在引用我们当前的实体,而 targetEntity 表示 JPA(这对我来说已经完全过时了)哪个类代表我们当前的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2016-04-18
    相关资源
    最近更新 更多