Hibernate Criteria:区分实体然后限制

2023-12-21

我有一个返回应用程序所需的所有数据的标准,基本上:

Criteria criteria = session.createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();

问题在于客户端/地址的关系是双向的:客户端上有一个地址,而一个地址可能属于多个客户端。

我想根据它们的 pk 检索“单个”客户端对象,当然,还有一些客户端显示在表中。

因为 setFirstResult/setMaxResults 首先执行,所以我在已应用的限制内得到了重复的客户端。在(使用应用程序级别而不是分组依据)之后,hibernate 删除了重复的客户端,因此我最终得到的客户端数量少于 setMaxResults 中指定的最大值。

无法分组依据(投影组),因为它不会返回客户端/地址中所需的所有列,仅返回查询分组依据的组。

(总而言之,我的表每页有 100 个结果,但在丢弃重复项后,我有 98 个结果而不是 100 个...)这是因为限制:LIMIT 0,100 是在 hibernate 组之前应用的,而它应该在之后执行)


正如“Ashish Thukral”链接的线程中指出的那样,下一行解决了这个问题:

criteria.setFetchMode("address.clients", FetchMode.SELECT);

它可以防止导致问题发生的连接。

当然,可以从 xml 配置文件中删除 fetch="join",但此解决方案不会影响可能检索 bean 的其他位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate Criteria:区分实体然后限制 的相关文章

随机推荐