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

使hibernate不包括select子句中联接表中的字段,hibernate,Hibernate,我在使用Hibernate的DetachedCriteria的SQL中遇到了性能问题。我有几个多对一的关系,当Hibernate生成SQL时,它包括来自表的所有字段,这些表在from中连接。 发生这种情况时,MySQL需要花费很长时间来运行查询(该问题中还添加了order by和子查询)。对于我目前的50k记录~6秒。当我删除SELECT中不必要的字段以只选择我关心的域对象时,它在500ms以下运行良好 有没有办法告诉Hibernate不要包含连接中的字段 我已尝试将映射文件中的fetch参数设

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

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

我已尝试将映射文件中的fetch参数设置为“join”和“select”,这对生成的SQL没有影响

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


我可以尝试将查询编写为HQL,但使用子查询只会让它更麻烦。

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

以下是一个来自过去项目的示例:

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);

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

我有同样的问题,听起来很奇怪,没有办法这样做。
这听起来是一个非常常见的场景,使用联接进行筛选,但不加载整个关联实体。

我们默认为延迟加载,但由于联接,字段仍然是select查询的一部分。正如我所读到的,这种行为似乎是为了允许对来自联接的字段进行排序;如果有一个简单的方法来项目实体。*那就太好了。我还必须设置结果转换器,以便使用Transformers.aliasToBean(RootEntity.class))+1正确设置对象:我花了大量时间试图正确设置。你的回答真的很有帮助。谢谢没有办法用注释来实现这一点吗?用类似@Transient的东西标记该表或该表中的列?