我在使用Hibernate的DetachedCriteria的SQL中遇到了性能问题。我有一些多对一关系,当Hibernate生成SQL时,它包括FROM中连接的表中的所有字段。 当发生这种情况时,它需要MySQL很长时间来运行查询(它还有一个order by和sub查询添加到问题中)。对于我目前的50k记录~6秒。当我将SELECT中不必要的字段删除到我关注的域对象时,它在500ms以下运行良好。
有没有办法告诉Hibernate不要包含连接中的字段?
我已经尝试将映射文件中的fetch参数设置为'join'和'select',它在生成的SQL中没有任何区别。
我也尝试过设置不同的根条目,但是从我读过的内容来看,这不适用于分页(我也在做)。
我可以尝试将查询编写为HQL,但是使用子查询会让它变得更加令人头疼。
答案 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?