gpt4 book ai didi

java - 按需预加载

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:51:50 26 4
gpt4 key购买 nike

我做一个查询:

String query = "SELECT DISTINCT a FROM A a FETCH ALL PROPERTIES " +
"JOIN a.Bs AS b " +
"JOIN b.Cs AS c WHERE c = :c";
Query q = DAO.getSession().createQuery(query);
q.setParameter("c", c);
return q.list();

即使我在 a 上说过 FETCH ALL PROPERTIES,当我访问 A 拥有的所有集合时,它们仍然需要加载,因此不会急切加载。它们被定义为延迟加载,这是我想要的默认行为,但这是一个异常(exception):我希望它们立即加载。我试过将 JOIN 换成 LEFT OUTER JOIN 来激发 Hibernate 加载它们,我试过设置 q.setFetchMode("a", FetchMode. EAGER),但它不存在用于查询。

As 的列表很长,而且他们有很多集合,所以使这个 n+1 查询非常慢(大约十秒,而不是在一个单独的查询中进行,这将是子-第二速度)。我更喜欢一次查询并一次加载所有必要的东西。关于如何做到这一点有什么建议吗?

PS,小奖励问题:如果我替换 "JOIN b.Cs AS c WHERE c = :c";
"WHERE :c IN b.Cs"; 行,我得到一个 SQL 异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1

它所指的双括号是“and ('151000000-0000' in (.))”,其中 151000000-0000 是 c 的主键。知道为什么我这样做时会收到此错误,而加入 b.Cs 时却不会收到此错误吗?

更新,根据要求,这是我用于映射的方式。 B 和 C 的设计非常相似:

@Entity
@Table(name = "tblA")
public class A {
@Id
String AId;

@Column(name = "shortName", length = 12, nullable = false)
String shortName;

@OneToMany(fetch=FetchType.LAZY, mappedBy="theA")
private Set<B> Bs;

@OneToMany(fetch=FetchType.LAZY, mappedBy="theA")
private Set<D> Ds;

@OneToMany(fetch=FetchType.LAZY, mappedBy="theA")
private Set<E> Es;

@OneToMany(fetch=FetchType.LAZY, mappedBy="theA")
private Set<F> Fs;
}

B、D、E、F中的A定义如下:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "AId", nullable = true)
@ForeignKey(name="FK_KategoriID")
private A theA;

干杯

尼克

最佳答案

fetch all properties 不是您想要的;它用于告诉 Hibernate 您希望它获取单值延迟加载的属性。详情为here .

您需要在查询中指定 join fetch:

SELECT DISTINCT a FROM A a
LEFT JOIN FETCH a.Bs AS b
LEFT JOIN FETCH b.Cs AS c
WHERE c = :c

就奖金问题而言,WHERE :c IN b.Cs 是非法语法。根据 C 的映射方式,您可能需要查看 elements()函数代替。

关于java - 按需预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1668053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com