我对Hibernate很新.我发现我们可以使用以下两种不同的方式获得不同的结果.谁能告诉我他们之间有什么区别?何时使用其他?
Projections.distinct(Projections.property("id"));
Run Code Online (Sandbox Code Playgroud)
VS
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud) 多年来这似乎是一个众所周知的问题,可以在这里阅读:http: //blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-走,错用,加入/
甚至在hibernate faqs中找到引用:
这也已在之前的SO上讨论过
如何通过连接和基于行的限制(分页)在hibernate中获得明显的结果?
问题是,即使经过所有这些资源,我也无法解决我的问题,这似乎与这个标准问题有点不同,尽管我不确定.
这里提出的标准解决方案涉及创建两个查询,第一个用于获取不同的ID,然后在更高级别的查询中使用这些查询来获得所需的分页.我的情况下的hibernate类就像
A
- aId
- Set<B>
B
- bId
Run Code Online (Sandbox Code Playgroud)
在我看来,子查询似乎对我来说很好,并且能够获得不同的aIds但是应该进行分页的外部查询再次获取重复项,因此子查询中的distinct不起作用.
假设我有一个A对象有一组四个B对象,我的分析是因为引入了set,同时获取了数据
session.createCriteria(A.class).list();
Run Code Online (Sandbox Code Playgroud)
hibernate在列表中填充指向一个对象的四个引用.因此,标准解决方案对我来说是失败的.
有人可以帮忙提出这个案例的解决方案吗?
编辑:我决定自己从独特的结果集中进行分页.另一个同样糟糕的方法可能是延迟加载B对象但是这需要对所有A对象进行单独查询以获取相应的B对象
我有一个Hibernate条件查询错误地提取最大结果.在许多情况下,当我指定20个最大结果时,查询实际上只返回1或5个结果,因为限制会返回许多重复项.
Criteria c = session.createCriteria(DomainObject.class);
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.createAlias("tags.list", "tag");
c.createAlias("names", "name");
c.createAlias("site", "site");
c.createAlias("site.tags.list", "siteTag");
// loads of or/and eq/like restrictions.
c.setFirstResult(0);
c.setMaxResults(20);
return c.list();
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,以便如果我说20个最大结果,它确实会返回20区结果?hibernate将查询限制为20个结果,并且在数据库级别而不是在数据库级别进行不同的过滤,这似乎很疯狂.
救命?