你如何在HQL中创build一个独特的查询

有没有办法在HQL中创build一个独特的查询。 通过使用“distinct”关键字或其他方法。 我不确定是否独立是HQL的有效密钥,但是我正在寻找SQL关键字“distinct”的HQL等价物。

这是我们使用的一个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}); 

值得注意的是,HQL中的distinct关键字并不直接映射到SQL中的distinct关键字。

如果在HQL中使用distinct关键字,那么有时Hibernate将使用distinct SQL关键字,但在某些情况下,它将使用结果转换器来产生不同的结果。 例如,当你使用这样的外连接:

 select distinct o from Order o left join fetch o.lineItems 

在这种情况下,不可能在SQL级别过滤掉重复项,所以Hibernate使用ResultTransformer在SQL查询执行过滤重复项。

下次做这样的事情

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

您也可以使用Criteria.DISTINCT_ROOT_ENTITY和Hibernate HQL查询。

例:

 Query query = getSession().createQuery("from java_pojo_name"); query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return query.list(); 

结果转换器结合HQL查询,我有一些问题。 当我尝试

 final ResultTransformer trans = new DistinctRootEntityResultTransformer(); qry.setResultTransformer(trans); 

它没有工作。 我不得不像这样手动转换:

 final List found = trans.transformList(qry.list()); 

Criteria API变压器工作得很好。

我的主查询在模型中看起来像这样:

 @NamedQuery(name = "getAllCentralFinancialAgencyAccountCd", query = "select distinct i from CentralFinancialAgencyAccountCd i") 

而且我还没有得到我认为“明显”的结果。 他们只是基于表上的主键组合。

所以在DaoImpl我添加了一个换行符,最终得到了我想要的“不同的”回报。 一个例子是,而不是看到00四次,现在我只看到一次。 这里是我添加到DaoImpl的代码:

 @SuppressWarnings("unchecked") public List<CacheModelBase> getAllCodes() { Session session = (Session) entityManager.getDelegate(); org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd"); q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // This is the one line I had to add to make it do a more distinct query. List<CacheModelBase> codes; codes = q.list(); return codes; } 

我希望这有助于! 再一次,如果你遵循实现服务,dao和模型types的项目的编码实践,这可能只会起作用。

假设你有一个客户实体映射到CUSTOMER_INFORMATION表,并且你想获得客户的不同firstName的列表。 你可以使用下面的代码片段来获得相同的结果。

 Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName"); Object [] firstNamesRows = distinctFirstName.list(); 

我希望它有帮助。 所以在这里我们使用group而不是使用distinct关键字。

此外,以前我发现很难使用不同的关键字,当我想将其应用到多个列。 例如,我想要得到不同的firstName,lastName然后分组将通过简单的工作。 在这种情况下,我很难使用截然不同的东西。

我有一个答案为Hibernate查询语言使用不同的领域。 你可以使用* SELECT DISTINCT(TO_CITY)FROM FLIGHT_ROUTE *。 如果您使用SQL查询,则返回String List。 你不能使用实体类的返回值。 所以解决这类问题的答案是使用HQLSQL

 FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY); 

SQL查询语句中获得DISTINCT ROUTE_ID并作为Listinput。 IN查询从IN(List)中过滤不同的TO_CITY。

返回types是Entity Beantypes。 所以你可以在诸如AutoComplement之类的AJAX中使用。

一切都可以