Hibernate - 如何在不执行 Join 的情况下使用 Criteria Query 仅 select 外键值?
Hibernate - How to select just the foreign key value using Criteria Query without doing a Join?
所以有一个类似(几乎相同)的问题:但是我需要避免加入。
所以我有两个 tables,一个与另一个有 FK
(服务)
- id
- 名字
- account_id
(账户)
- id
- 名字
服务 class 具有这样定义的外键:
@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 已经在服务中 table.
现在,我的条件查询如下所示:
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")
它只是抛出一个异常,指出该字段不可用。
避免这种情况的正确方法是什么?
好的,我刚刚找到问题的答案:
而不是做
root.join("account").get("id")
我只需要做:
root.get("account").get("id")
避免执行 JOIN。
所以有一个类似(几乎相同)的问题:
所以我有两个 tables,一个与另一个有 FK
(服务)
- id
- 名字
- account_id
(账户)
- id
- 名字
服务 class 具有这样定义的外键:
@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 已经在服务中 table.
现在,我的条件查询如下所示:
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")
它只是抛出一个异常,指出该字段不可用。
避免这种情况的正确方法是什么?
好的,我刚刚找到问题的答案:
而不是做
root.join("account").get("id")
我只需要做:
root.get("account").get("id")
避免执行 JOIN。