2010-11-22 20 views
2

我正在使用Hibernate Criteria来返回结果列表(对各种列值进行过滤),但其中一些对象具有相同的值,我只需要一位“代表”。Hibernate Criteria唯一结果(除键以外的列)

例如:我返回了3个车辆对象的列表,其id /主键为123,456,789,制造商代码为:111,111,222。我只想返回一个列表有两个对象:123/111,789/222。

有没有办法给Hibernate Criteria添加一个限制,以便在这个例子中只返回唯一的(或第一个)制造商代码结果?请让我知道是否需要任何额外的信息/澄清。

感谢您的任何建议!

+0

http://stackoverflow.com/questions/8491796/hibernate-group-by-criteria-object 上面的链接对此是一个很好的答案。 – Ketan 2012-03-12 09:45:07

回答

1

的simpliest方法是实施适度ResultTransformer并将其应用到您的查询。

如果你真的希望它在数据库端执行,你需要一些棘手的查询,像这样(在HQL/JPQL为了简洁):

SELECT v FROM Vehicle v 
WHERE v.id = 
    (SELECT MIN(sv.id) FROM Vehicle sv WHERE sv.manufacturerCode = v.manufacturerCode) 
1

如果你正在使用JPA和Hibernate的,你可以使用类似如下:

Query q = em.createQuery("select cat from DomesticCat cat"); 
q.setMaxResults(1); 
List cats = q.getResultList(); //return any one cat from matched rows 

现在,刚刚得到列表中的第一个项目。 顺便说一句,照顾NullPointerException并在进行任何进一步操作之前检查列表的大小。

否则,如果您使用的是休眠没有JPA。你可以去下面的一个[uniqueResult()]:

Query query =session.createQuery("select ao from AccountOwner ao "); 
AccountOwner ao=query.uniqueResult(); 
+0

我明白你在说什么,但是这只会返回1条记录。我想要列出所有记录,但在我的示例中,每个“制造商”仅限于一个结果。 – 2010-11-22 18:06:26

+1

然后,不要设置MaxResult /不去UniqueResult,而是修改查询以为'manufacturer'添加'group by'子句。 – 2010-11-22 18:13:01