首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按需急切加载

按需急切加载
EN

Stack Overflow用户
提问于 2009-11-03 23:30:01
回答 2查看 8.6K关注 0票数 3

我做了一个查询:

代码语言:javascript
运行
复制
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拥有的所有集合时,它们仍然需要加载,因此不会急于加载。它们被定义为延迟加载,这是我想要的默认行为,但这是一个例外:我希望现在就加载它们。我曾尝试将JOIN替换为LEFT OUTER JOIN,以促使Hibernate加载它们,我也尝试过设置q.setFetchMode("a", FetchMode.EAGER),但它不存在用于查询。

As的列表相当长,而且它们有相当多的集合,所以将其作为n+1查询非常慢(大约10秒,而不是在单个查询中进行,这将是亚秒级的速度)。我更倾向于使用一个查询并加载所有需要的东西。对如何做到这一点有什么建议吗?

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

代码语言:javascript
运行
复制
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的设计非常相似:

代码语言:javascript
运行
复制
@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中的theA定义如下:

代码语言:javascript
运行
复制
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "AId", nullable = true)
@ForeignKey(name="FK_KategoriID")
private A theA;

干杯

耐克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-04 01:05:05

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

您需要在查询中指定join fetch

代码语言:javascript
运行
复制
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是非法语法。根据您的函数的映射方式,您可能希望改为查看elements()函数。

票数 10
EN

Stack Overflow用户

发布于 2009-11-04 01:04:24

FETCH ALL PROPERTIES仅适用于惰性属性(其中属性是字符串、整数等...)不是一对五关联(即集合)

请参阅A Short Primer On Fetching Strategies

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1668053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档