java Hibernate/JPA单向OneToMany,连接条件为源表中的常量值
我想使用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
}
我尝试了一些我有占位符注释的方法:
@其中注释
这不起作用,因为这适用于目标实体
@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
提前谢谢
# 1 楼答案
在我看来,您应该创建一个特定的查询来实现您的目标,而不是使用常量参数放置特定的注释。除了Hibernate,我没有看到你提到其他框架,所以我会举一些Hibernate的例子。在
Building
类中unidirectional
映射如下所示:然后,您可以像这样使用
TypedQuery
获取数据我的解决方案不是特定于Hibernate的,实际上你可以用简单的JPA来实现这一点。希望这能帮助你实现目标
# 2 楼答案
为什么不使用inheritance ?(我和JPA一起使用,我从不直接使用hibernate)
以及:
# 3 楼答案
由于需要筛选源表,所以可以使用@Loader注释
如果在数据库中也可以使用视图,则在数据库中使用视图的方法会更好、更清晰。否则,将建筑重命名为明确表示过滤的内容
另一种方法是:@Filter,@FilterDef