【问题标题】:Querydsl set fetch mode in a queryQuerydsl 在查询中设置获取模式
【发布时间】:2014-06-30 21:42:46
【问题描述】:

我遇到的情况是 Card 实体有一个 Person 的外键。

public class Card implements java.io.Serializable {
    private String cardid;
    private Person person;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USERID")
    public Person getPerson() {
        return this.person;
    }
}

此人的默认获取类型是 LAZY。我可以在查询中将获取类型指定为 EAGER:

QCard qCard = QCard.card;
JPQLQuery query = getQuery().from(qCard);
query.list(qCard);

感谢您的帮助。

【问题讨论】:

  • 你可以在你的对象被分离之前调用getPerson()方法来加载Person对象,你是否有特定的理由来改变获取类型?
  • 之所以要更改fetch类型,是为了优化查询。我有一个需要加载多个外键对象的情况。它似乎运行缓慢。
  • 所以您在 QueryDSL 中寻找来自 JPAQL 的 FETCH 关键字。这是你要找的吗? groups.google.com/forum/#!msg/querydsl/Geexg_eN2yA/iREXf-DM0nwJ
  • 这似乎是我要找的。我会试一试并写回结果。所以我可以为每个外键对象添加这样的东西来急切加载:“query.innerJoin(qCard.person).fetch();”
  • 我添加了“query.innerJoin(qCard.cmsPerson).fetchAll();”但它仍然懒惰地获取 person 对象。

标签: java hibernate querydsl


【解决方案1】:

你试过了吗

QCard qCard = QCard.card;
List<Card> cards = getQuery().from(qCard)
    .innerJoin(qCard.person).fetch()
    .list(qCard);

对于 QueryDSL 4.0.2+

QCard qCard = QCard.card;
List<Card> cards = getQuery().from(qCard)
    .innerJoin(qCard.person).fetchJoin()
    .select(qCard).fetch();

【讨论】:

  • 最初我尝试使用 fetchAll 进行 innerJoin。我发现 leftJoin 与 fetch 的组合有效。不确定是这种情况还是某些缓存问题。
  • 请将您的工作代码放入答案中并将此问题标记为已解决
  • 蒂莫的回答有效。如果我使用 fetch() 会急切地提取人,但如果我使用 fetchAll() 则不会。
  • 截至QueryDSL 4.0.2,界面已更改。要设置最后一个连接的获取模式,请调用 fetchJoin()。要最终获得结果,请调用 fetch()。所以它将是 List cards = getQuery().from(qCard) .innerJoin(qCard.person).fetchJoin() .fetch();
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2014-03-16
  • 2011-06-23
  • 2016-08-07
相关资源
最近更新 更多