这将有助于准确了解您所看到的重复查询。正如其他人指出的那样,我们只是在猜测而没有看到您的映射。您可能会遇到 Hibernate 的急切获取。这是 Hibernate 尝试为每个匹配非常通用名称的用户(及其地址、电话、宠物等)加载整个对象图的地方,其中包含“tom”查询。尝试关闭 Hibernate 映射文件或注释中用户属性的默认预取,然后执行以下操作:
假设您对表USER_ADDRESS (hibernate property "addresses")
、USER_PHONE (property "phones")
和进行了大量重复查询USER_PET (property "pets")
。使用以下条件调用在原始查询中加入这些属性并减少重复查询。Hibernate 知道如何将这些列拆分为单独的对象。您也可以尝试添加最大数量的返回结果。
Criteria myUsers = getCurrentSession().createCriteria(User.class);
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE));
myUsers.createCriteria("addresses"); // NEW
myUsers.createCriteria("phones"); // NEW
myUsers.createCriteria("pets"); // NEW
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
myUsers.setMaxResults(100); // NEW
result.addAll(myUsers.list());
您可以在此处的第 15.4-15.6 节中了解更多信息