【发布时间】:2017-08-02 21:52:19
【问题描述】:
我想使用 Hibernate 注释来表示使用连接的单向一对多关系。我想在连接上添加一个条件,所以它只发生在 source 表中的一列(“一”)等于一个常数值时。例如。
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")
})
这不起作用,因为我收到以下错误(为清楚起见进行了简化):Syntax error in SQL statement "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
提前致谢!
【问题讨论】:
-
我不明白。既然您使用的是
JOIN,而不是LEFT JOIN,为什么不直接使用where 子句呢?SELECT * FROM buildings b JOIN building_floors bf on bf.building_id = b.id WHERE b.type = 'OFFICE'。你期待什么结果? -
对不起!请原谅我的错误。我的意思是我的示例查询是
LEFT JOIN。我将编辑我的问题。
标签: java hibernate jpa join hibernate-annotations