当前位置: 首页 > 知识库问答 >
问题:

Hibernate/JPA单向OneToMany在源表中的常量值上具有连接条件

刘博雅
2023-03-14

我想使用Hibernate注释来表示使用联接的单向一对多关系。我希望在连接上添加一个条件,这样它只在源表中的列(“一”)等于一个常量值时才发生。例如。

SELECT *
FROM buildings b
LEFT JOIN building_floors bf on bf.building_id = b.id AND b.type = 'OFFICE'
@Entity
@Table(name = "buildings")
public class Building {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "type")
    private String type;

    @OneToMany(mappedBy = "buildingId",
            fetch = FetchType.EAGER,
            cascade = {CascadeType.ALL},
            orphanRemoval = true)
    @Fetch(FetchMode.JOIN)
    // buildings.type = 'OFFICE'   ????
    private Set<BuildingFloors> buildingFloors;

    // getters/setters
}

@Entity
@Table(name = "building_floors")
public class BuildingFloor {

    @Id
    @Column(name = "building_id")
    private int buildingId;

    @Id
    @Column(name = "floor_id")
    private int floorId;

    @Column(name = "description")
    private String description;

    // getters/setters
}
@JoinColumns({
        @JoinColumn(name = "building_id", referencedColumnName = "id"),
        @JoinColumn(name = "'OFFICE'", referencedColumnName = "type")
})

这不起作用,因为我得到了以下错误(为清楚起见进行了简化):SQL语句“select*FROM buildings b JOIN building_floresbf on bf.building_id=b.id AND bf.'office'=b.type”语法错误

@JoinColumns({
        @JoinColumn(name = "building_id", referencedColumnName = "id"),
        @JoinColumn(name = "buildings.type", referencedColumnName = "'OFFICE'")
})

这不起作用,因为在使用单向OneToMany关系时,referencedColumnName来自源表。因此,我得到错误:org.hibernate.mappingException:无法在建筑物中找到逻辑名称为“office”的列

提前道谢!

共有1个答案

徐晔
2023-03-14

为什么不用继承呢?(我和JPA一起使用,我从来没有直接使用hibernate)

@Entity
@Inheritance
@Table(name = "buildings")
@DiscriminatorColumn(name="type")
public class Building {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "type")
    private String type;
}

和:

@Entity
@DiscriminatorValue("OFFICE")
public class Office extends Building {
    @OneToMany(mappedBy = "buildingId",
        fetch = FetchType.EAGER,
        cascade = {CascadeType.ALL},
        orphanRemoval = true)
    private Set<BuildingFloors> buildingFloors;
}
 类似资料:
  • 我有一个样本记录如下的数据库设计。问题和答案表共享相同的内容表,存储它们的措辞翻译。通过在内容指示符中指定1,我知道内容的引用是指问题的id(2表示答案)。 问题 回答 内容 我尝试使用以下代码将关系与 JPA 链接起来: 它在编译时抛出以下异常: 由:org.hhibernate引起。MappingException:实体jpatest.model的映射中出现重复列。内容列:引用(应使用inse

  • 我有2个模型/注释类,产品细节和Vnf细节。我想使用JPA HIbernate将2个表与@Oneto很多关系连接起来 产品细节模型类在下面的@Oneto许多映射中: VNF详细信息如下所示,其中有@ManytoOne和JoinColumn: 当我插入数据时,数据被插入,但VnfDetails表中的产品ID为空。 它应该是具有"ID"的外键PRODUCT_DETAILS表。 无法解决此问题。

  • 问题内容: 我正在尝试使用join语句中的常量值从同一表中加入不同实体。在SQL中,我会做这样的事情… 在Java + JPA / Hibernate中,我正在尝试执行以下操作… 提前致谢! 问题答案: 您正在查看非标准联接。这是处理这种情况的文档: http://docs.oracle.com/cd/E13189_01/kodo/docs40/full/html/ref_guide_mappin

  • 问题内容: 为什么hibernate对这些类使用联接表? 我既不需要联接表也不需要双向关联:( 问题答案: 因为这是它的设计方式,也是JPA规范要求它映射这样的关联的方式。如果要在广告投放表中添加联接列,请使用 这是有据可查的。

  • 拥有2个实体:订单和产品。1个订单可以有多个产品,多个产品可以属于1个订单(每个产品只属于1个订单)。 尝试了@JsonIgnore。这不会返回子元素或父元素。尝试了@JsonManagedReference和@JsonBackReference-仍然没有成功。 请给我指点一下

  • 问题内容: 我遇到一个问题,其中Hibernate(4.1.8.FINAL)返回带有NULL值的列表(单向OneToMany映射)。 我得到的是: 我得到一个大小为21的列表,其中EntryAddress在第10个索引上,而2nd Entry Address在第20个索引上。 我所期望的 -我期望一个只有两个EntryAddress对象的List: 这是最小的源代码: 这是mysql结构(Inno