You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hibernate传统Criteria API时,如何避免关联表字段被加入SQL查询?

Hibernate传统Criteria API关联过滤的SQL冗余问题

当使用Hibernate传统Criteria API对many-to-one关联进行过滤,且仅需查询基础实体类型时,生成的SQL仍会将关联表的所有字段纳入查询,示例如下:

实体类

class User
{
    long id;
    boolean active;
    Address address;
}

class Address
{
    long id;
    String streetNum;
    String street;
    String country;
}

带别名的Criteria查询

Criteria criteria = session.createCriteria(User.class, "u");
criteria.createAlias("u.address", "a");
criteria.add(Restrictions.eq("a.streetNum", "15"));

final List<User> users = criteria.list();

生成的SQL语句

SELECT 
    u.id,
    u.active,
    a.id,
    a.streetNum,
    a.street,
    a.country
FROM
    user AS u
    JOIN address AS a ON u.addressID = a.id
WHERE
    a.streetNum = 15

期望生成的SQL语句

SELECT 
    u.id,
    u.active
FROM
    user AS u
    JOIN address AS a ON u.addressID = a.id
WHERE
    a.streetNum = 15

性能问题

这种情况会导致SQL包含关联别名表的所有字段,在多字段表、多关联过滤及分页场景下会造成严重性能损耗,而实际上查询并不需要获取关联表的字段。

NHibernate对比

C#的NHibernate中有Projections.rootEntity()方法(推测用于解决此类问题),但Java Hibernate 5.5.7版本中没有该方法。

内容的提问来源于stack exchange,提问作者djmj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 19:13:11