使用Querydsl在查询中设置获取模式

18

我有一个情况,其中一个卡实体具有指向人的外键。

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 对象,你有特定的原因需要更改获取类型吗? - Michael Técourt
我想改变获取类型的原因是为了优化查询。我有一个需要加载多个外键对象的情况,但它似乎运行缓慢。 - Marko
жүҖд»ҘдҪ жӯЈеңЁеҜ»жүҫJPAQLдёӯзҡ„FETCHе…ій”®еӯ—еңЁQueryDSLдёӯзҡ„з”Ёжі•гҖӮиҝҷжҳҜдҪ иҰҒжүҫзҡ„еҗ—пјҹhttps://groups.google.com/forum/#!msg/querydsl/Geexg_eN2yA/iREXf-DM0nwJ - Michael Técourt
看起来这正是我要找的。我会试一试并回写结果。所以我只需为每个外键对象添加类似于以下内容即可进行急切加载:“query.innerJoin(qCard.person).fetch();” - Marko
我添加了 "query.innerJoin(qCard.cmsPerson).fetchAll();" 但它仍然是懒加载 person 对象。 - Marko
1个回答

27

你试过了吗?

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();

最初我尝试使用 innerJoin 和 fetchAll 进行操作。后来发现 leftJoin 和 fetch 的组合可以正常工作。不确定是这种情况还是缓存出了问题。 - Marko
请将您的工作代码放在答案中,并将此问题标记为已解决。 - Michael Técourt
Timo的答案可行。如果我使用fetch(),则会急切地获取该人,但如果我使用fetchAll(),则不会。 - Marko
8
QueryDSL 4.0.2版本开始,该接口已经发生了变化。要设置最后一个连接的获取模式,请调用fetchJoin()。要最终获取结果,请调用fetch()。因此,代码如下:List cards = getQuery().from(qCard) .innerJoin(qCard.person).fetchJoin() .fetch(); - ta55e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接