我有一个标准可以返回应用程序所需的所有数据,基本上是:
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();
问题是关系客户端/地址是双向的:客户端上有一个地址,一个地址可能属于多个客户端。
我想检索&#34;单身&#34;客户端对象基于他们的pk当然是一些客户端,因为它们显示在表中。
因为首先执行了setFirstResult / setMaxResults,所以我在已经应用的限制内获得了重复的客户端。之后(使用的应用程序级别不是group by)hibernate获取重复客户端的rids,所以我最终得到了setMaxResults中指定的最大值的客户端。
无法按(投影组)进行分组,因为它不会返回客户端/地址中所需的所有列,只返回查询所分组的列。
(总而言之,我的表每页有100个结果,但是在丢弃重复项后我有98个结果而不是100个...)这是因为限制:LIMIT 0,100应用于休眠组之前应该执行的AFTER)
答案 0 :(得分:9)
正如在“Ashish Thukral”链接的帖子中指出的那样,下一行解决了这个问题:
criteria.setFetchMode("address.clients", FetchMode.SELECT);
它可以防止导致问题的连接。
当然,可以从xml配置文件中删除fetch =“join”,但此解决方案不会影响可能正在检索bean的其他位置。
答案 1 :(得分:6)
如果您根据ID查找客户端,如下所示。根据您的标准,不需要max和init大小,因为它总是返回一个客户端。
Criteria criteria = getSession().createCriteria(Client.class);
criteria .add(Restrictions.eq("id", yourClientId);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();
如果您根据ID查找地址,如下所示。
Criteria criteria = getSession().createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria .add(Restrictions.eq("address.id", yourAddressId);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();
答案 2 :(得分:0)
如果我正确理解您的关系,您将在每个客户端实体类的地址和一个地址中有一个客户列表。 所以,如果你只想要一个客户列表,那么最重要的是,你不能通过
获得它们Criteria criteria = session.createCriteria(Client.class);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();
为什么要创建别名并使用distinct_root_entity?如果您需要获取该地址,当您在DAO或ServiceImpl中访问它时,Hibernate会为您懒散地获取它。
如果我错了,请纠正我。