Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Querydsl在查询中设置获取模式_Java_Hibernate_Querydsl - Fatal编程技术网

Java Querydsl在查询中设置获取模式

Java Querydsl在查询中设置获取模式,java,hibernate,querydsl,Java,Hibernate,Querydsl,我遇到的情况是,一个卡实体有一个人的外键 public class Card implements java.io.Serializable { private String cardid; private Person person; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "USERID") public Person getPerson() {

我遇到的情况是,一个卡实体有一个人的外键

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。我是否可以在查询中指定要使用的提取类型:

QCard qCard = QCard.card;
JPQLQuery query = getQuery().from(qCard);
query.list(qCard);
谢谢你的帮助。

你试过了吗

QCard qCard = QCard.card;
List<Card> cards = getQuery().from(qCard)
    .innerJoin(qCard.person).fetch()
    .list(qCard);
QCard QCard=QCard.card;
列表卡片=getQuery().from(qCard)
.innerJoin(qCard.person).fetch()
.名单(qCard);

对于QueryDSL 4.0.2+

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

您可以在对象分离之前调用
getPerson()
方法来加载Person对象,您是否有更改提取类型的特定原因?我要更改提取类型的原因是为了优化查询。我需要加载多个外键对象。它似乎工作得很慢。因此,您正在QueryDSL中从JPAQL查找
FETCH
关键字。这就是你要找的吗?这似乎就是我要找的。我会尝试一下,然后写下结果。因此,我可以为每个外键对象添加类似的内容以进行急切加载:“query.innerJoin(qCard.person.fetch();“我添加了”query.innerJoin(qCard.cmsPerson.fetchAll();“但它仍然懒散地获取person对象。最初,我尝试使用fetchAll进行innerJoin。我发现leftJoin和fetch的组合是有效的。不确定是这种情况还是缓存问题。请将您的工作代码放入答案中,并将此问题标记为resolvedTimo的答案有效。如果我使用fetch(),则会急切地抓取Person,但如果我使用fetchAll(),则不会。截至,接口已更改。要设置最后一个联接的获取模式,请调用fetchJoin()。要最终获得结果,请调用fetch()。所以它应该是listcards=getQuery().from(qCard.innerJoin(qCard.person.fetchJoin().fetch();