我有以下表结构
**BPV table**
id, vid, bid
**vt table**
vid, name, gender
**uv table**
uvid, vid, cast,...
我想在休眠(mysql)中基于vid在BPV,uv之间写左连接
bpv 实体的 vt 是一对一的,uv 的 vt 是一对一的,但实际上没有 bpv &uv
Hibernate 有 Criteria API,这是一种以 OO 方法执行查询的好方法。如果你有你的持久实体,那么你可以这样做:
Criteria criteria = session.createCriteria(BPV.class, "bpv");
criteria.createCriteria("bpv.vt", "vt", CriteriaSpecification.LEFT_JOIN);
criteria.createCriteria("vt.uv", "uv", CriteriaSpecification.LEFT_JOIN);
// add restrictions
return criteria.list();
休眠 SQL:
from BPV where BPV.uv.cast = "your_condition"
它需要正确描述的实体和依赖项;
或纯 SQL:
select * from BPV left join uv on BPV.vid = uv.vid where uv.cast = "your_condition"
您要求的是不可能的,有一个 Theta Join 解决方案,但它只支持内部连接,因此您必须放弃该方法并执行以下解决方案之一:
映射正确的关系:
如果这个查询是一个不寻常的场景,你不必改变你的实际映射,你可以用新的映射创建一个新的 dto 类,并将它用于这个查询。
使用本机 SQL:
这也很简单,使用.createSQLQuery()
, 来运行本机查询,您可以使用.addScalar()
+.setResultTransformer(Transformers.aliasToBean(someDto.class))
来获取实体列表。