使hibernate不包括select子句中连接表的字段

时间:2009-02-10 19:52:56

标签: hibernate

我在使用Hibernate的DetachedCriteria的SQL中遇到了性能问题。我有一些多对一关系,当Hibernate生成SQL时,它包括FROM中连接的表中的所有字段。 当发生这种情况时,它需要MySQL很长时间来运行查询(它还有一个order by和sub查询添加到问题中)。对于我目前的50k记录~6秒。当我将SELECT中不必要的字段删除到我关注的域对象时,它在500ms以下运行良好。

有没有办法告诉Hibernate不要包含连接中的字段?

我已经尝试将映射文件中的fetch参数设置为'join'和'select',它在生成的SQL中没有任何区别。

我也尝试过设置不同的根条目,但是从我读过的内容来看,这不适用于分页(我也在做)。

我可以尝试将查询编写为HQL,但是使用子查询会让它变得更加令人头疼。

3 个答案:

答案 0 :(得分:5)

您可以设置一个包含仅您感兴趣的属性列表的投影。

以下是过去项目的一个例子:

Criteria criteria = getSession().createCriteria(Something.class);
criteria.createCriteria("user", "u");

// only retrieve the following fields: id, state, viewCount, user.username
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("id"));
properties.add(Projections.property("state"));
properties.add(Projections.property("viewCount"));
properties.add(Projections.property("u.username"));

criteria.setProjection(properties);

答案 1 :(得分:1)

我有同样的问题,听起来很奇怪没有办法做到这一点。 这听起来是一种非常常见的情况,使用JOIN进行过滤,但不加载整个关联实体。

答案 2 :(得分:0)

您是否尝试为不想加载的类设置Lazy = true?