将@OneToOne与@Where一起使用

时间:2017-04-27 11:52:27

标签: scala hibernate jpa

我们假设我有2个人:BodyLegLeg包含字段side(其值可以是LeftRight),还有Body的外键。

我确定Body的每个实例只剩下一个,只有一个右腿。所以我想根据One-To-One字段的值在BodyLeg之间创建2个side映射。

换句话说,我在数据库级别上有One-To-Many关系,并希望在模型中获得One-To-One。有可能吗?

Body.scala

@Entity
@Table(name = "body")
case class Body(
    @(Id@field)
    var id: String = null,

    @(OneToOne@field)(cascade = Array(CascadeType.ALL), mappedBy = "body")
    var leftLeg: Leg = null,

    @(OneToOne@field)(cascade = Array(CascadeType.ALL), mappedBy = "body")
    var rightLeg: Leg = null
)

Leg.scala

@Entity
@Table(name = "leg")
case class Leg(
    @(Id@field)
    var id: String = null,

    @(OneToOne@field)
    @(JoinColumn@field)(name = "body_id")
    var body: Body = null,

    @(Column@field)
    var side: String = null
)

当然,我可以将其作为One-To-Many并为每条腿添加2个吸气剂,但我还需要在reporsitory中按左腿(例如)过滤,所以想要写这样的东西

@Query(value = "select b from Body b where b.id = ?1 and b.leftLeg.size = ?2)
def findBodyByLegSize(bodyId: String, size: String): Body

1 个答案:

答案 0 :(得分:0)

唯一的解决方案是将Leg Class复制到 LeftLeg RightLeg 并创建两个Leg表(可以使用extends)

@Entity
@Table(name = "LeftLeg")
case class LeftLeg (
    @(Id@field)
    var id: String = null,

    @(OneToOne@field)
    @(JoinColumn@field)(name = "body_id")
    var body: Body = null,

    @(Column@field)
    var side: String = null
)