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