【发布时间】:2020-10-14 05:09:20
【问题描述】:
所以有一个类似(几乎相同)的问题:How to select just the foreign key value using Criteria Query? 但我需要避免加入。
所以我有两张桌子,一张有 FK 到另一张
(服务)
- 身份证
- 姓名
- account_id
(帐户)
- 身份证
- 姓名
服务类具有这样定义的 FK:
@Entity
public class Service extends BaseDbEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private Account account;
...
而我想要做的是查询与给定帐户对应的所有服务,具有 accountId,而不进行 JOIN,因为 id 已经在服务表中。
现在,我的条件查询如下所示:
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Service> criteria = cb.createQuery(Service.class);
Root<Service> root = criteria.from(Service.class);
criteria
.select(root)
.where(cb.equal(root.join("account").get("id"), accountId));
session.createQuery(criteria).getResultStream();
这最终会生成这个查询:
Hibernate: select service0_.id as id1_3_, service0_.name as name4_3_, service0_.account_id as account_id6_3_ from Service service0_ inner join Account account1_ on service0_.account_id=account1_.id where account1_.id=?
这没有意义。它对一个字段进行连接,然后为该字段创建一个 where 子句。
如果我这样做:
root.get("account_id")
它只是抛出一个异常,说明该字段不可用。
避免这种情况的正确方法是什么?
【问题讨论】:
-
那么你需要在实体中为
account_id添加一个字段,并与字段example连接列。
标签: java postgresql hibernate hibernate-criteria criteria-api