使用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
相关产品推荐
相关产品推荐

