【问题标题】:Hibernate - How to select just the foreign key value using Criteria Query without doing a Join?Hibernate - 如何使用 Criteria Query 只选择外键值而不进行 Join?
【发布时间】: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


【解决方案1】:

好的,我刚刚找到了问题的答案:

我只需要这样做:

root.get("account").get("id")

【讨论】:

  • 您是否检查了未加入查询的查询?
  • 是的,查询日志现在这样写:Hibernate: select service0_.id as id1_3_, service0_.name as name4_3_, service0_.owner_id as owner_id6_3_, from Service service0_ where service0_.owner_id=?
  • owner_id 表示account_id 对吗?很高兴知道:)
  • 是的,抱歉,我正在做一些更改,这是 account_id
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 2014-09-02
  • 1970-01-01
  • 2011-01-03
  • 2013-05-27
  • 2013-05-10
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多