如何在HQL中创建Distinct查询

Mik*_*one 97 hibernate hql distinct

有没有办法在HQL中创建一个Distinct查询.通过使用"distinct"关键字或其他方法.我不确定distinct是否是HQL的有效关键字,但我正在寻找与SQL关键字"distinct"相当的HQL.

Fee*_*eet 122

这是我们使用的一小段hql.(名称已更改为保护身份)

String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
        return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});
Run Code Online (Sandbox Code Playgroud)

  • 当涉及文本类型时,这对mssql不起作用 (3认同)

Dan*_*iuc 54

值得注意的是,distinctHQL中的关键字不直接映射到distinctSQL中的关键字.

如果distinct在HQL中使用关键字,那么有时Hibernate将使用distinctSQL关键字,但在某些情况下,它将使用结果转换器来生成不同的结果.例如,当您使用这样的外部联接时:

select distinct o from Order o left join fetch o.lineItems
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无法在SQL级别过滤掉重复项,因此执行SQL查询,Hibernate使用a ResultTransformer来过滤重复项.


小智 16

下次做这样的事

 Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();
Run Code Online (Sandbox Code Playgroud)


aad*_*i53 9

您也可以使用Criteria.DISTINCT_ROOT_ENTITYHibernate HQL查询.

例:

Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();
Run Code Online (Sandbox Code Playgroud)