1

如果有很多来自 DB 的返回记录。它会得到stackoverflow问题。 User是一个类,它具有一对多的关系(与其他 3 个类)。当我打印出 SQL 时,我发现系统多次运行相同的查询以从 DB 中获取数据。有谁知道问题是什么?

result.addAll(getCurrentSession().createCriteria(User.class)
    .add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE))
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
    .list());
4

3 回答 3

0

如果您正在寻找名称中只有 tom 的用户,那么它不应该耗尽内存,除非您有很多 %tom% 呵呵。

您可以尝试对其进行限制,以便它一次只返回一些您可以处理的内容。

我不确定是否有人能在没有更多信息的情况下弄清楚为什么它运行相同的查询。

于 2008-12-26T21:06:38.870 回答
0

无论如何,您使用的是 EntityMode.DOM4J 吗?(即 Hibernate --> XML 而不是 Hibernate --> POJO)。如果不进行调整,嵌套关系就无法工作,因为 XML 生成器会无限递归,因为 POJOS 可以很好地处理它们。

我可以详细说明,但如果您不使用 DOM4J,那么问题就出在了其他地方。

于 2009-01-06T03:19:53.937 回答
0

这将有助于准确了解您所看到的重复查询。正如其他人指出的那样,我们只是在猜测而没有看到您的映射。您可能会遇到 Hibernate 的急切获取。这是 Hibernate 尝试为每个匹配非常通用名称的用户(及其地址、电话、宠物等)加载整个对象图的地方,其中包含“tom”查询。尝试关闭 Hibernate 映射文件或注释中用户属性的默认预取,然后执行以下操作:

假设您对表USER_ADDRESS (hibernate property "addresses")USER_PHONE (property "phones")和进行了大量重复查询USER_PET (property "pets")。使用以下条件调用在原始查询中加入这些属性并减少重复查询。Hibernate 知道如何将这些列拆分为单独的对象。您也可以尝试添加最大数量的返回结果。

Criteria myUsers = getCurrentSession().createCriteria(User.class);
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE));
myUsers.createCriteria("addresses"); // NEW
myUsers.createCriteria("phones"); // NEW
myUsers.createCriteria("pets"); // NEW
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
myUsers.setMaxResults(100); // NEW
result.addAll(myUsers.list());

您可以在此处的第 15.4-15.6 节中了解更多信息

于 2010-05-19T19:16:55.150 回答