java - Hibernate/JPA 单向 OneToMany 与源表中常量值的连接条件

标签 java hibernate jpa join hibernate-annotations

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

SELECT *
FROM buildings b
LEFT JOIN building_floors bf on bf.building_id = b.id AND b.type = 'OFFICE'

我想表示该查询的 b.type = 'OFFICE' 部分。

我的问题与这个问题非常相似,只是我在源表上有一个条件。 JPA/Hibernate Join On Constant Value

Java 实体如下所示:

@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
}

我已经尝试了一些带有占位符评论的东西:

@Where注解

这不起作用,因为它适用于目标实体。

@JoinColumns 注解

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

这不起作用,因为我收到以下错误(为清楚起见进行了简化): SQL 语句中的语法错误“SELECT * FROM buildings b JOIN building_floors bf on bf.building_id = b.id AND bf.'OFFICE ' = b.type"

一个不同的@JoinColumns 注解

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

这不起作用,因为在使用单向 OneToMany 关系时,referencedColumnName 来自源表。所以我收到错误:org.hibernate.MappingException: Unable to find column with logical name: 'OFFICE' in buildings

提前致谢!

最佳答案

为什么不使用 inheritance ? (我用的是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;
}

关于java - Hibernate/JPA 单向 OneToMany 与源表中常量值的连接条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471612/

相关文章:

java - 当我引用组合键时,出现无法找到具有逻辑名称的列错误

java - 在 HIbernate 中调用存储过程时找不到列 'id'

java - @JoinTable 使用导入键代替主键

java - 如何删除 android 中 Bottom Sheet 单对话框 fragment 创建的阴影?

java - 编写自定义 Lint 规则以确保在每次使用之前进行空检查以避免 NullPointerException

java - 使用流元素之间的相关性过滤流

java - 如何在 CRUDRepository 中编写具有特定列名的计数实体

java - 在Java中发送TAB控制字符

java - 如何在 hibernate 中创建具有多个条件的内部连接

java - 带有 POJO 构造函数的 Hibernate JoinColumn(没有实体)