- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我做一个查询:
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/
我是一名优秀的程序员,十分优秀!