我使用的是Hibernate 4.1.0.Final、MySQL 5.5和JPA 2.0。当从JPA查询返回值时,如何在不将函数重写为SQL(或JPQL)语句的情况下指定"distinct"子句?下面是我迄今为止如何编码我的JPA方法。。。
final List<ReturnedObject> foundReturnedObjects = new ArrayList<ReturnedObject>();
final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
final CriteriaQuery<ReturnedObject> query = builder.createQuery(ReturnedObject.class);
final Root<JoinedObject> JoinedObject = query.from(JoinedObject.class);
final Join<JoinedObject, ReturnedObject> ReturnedObject = JoinedObject.join(JoinedObject_.returnedObject);
if (params != null && !params.isEmpty())
{
query.where(JoinedObject.get(JoinedObject_.organization).in(params));
query.select(ReturnedObject);
foundReturnedObjects.addAll(m_entityManager.createQuery(query).getResultList());
} // if
return foundReturnedObjects;
然而,问题是可能会返回重复的项目。注意,我意识到我可以将所有结果传输到java.util.Set,但这个问题特别是关于使用DISTINCT子句执行SQL,而不是在查询返回后执行。
这可以通过使用不同的方法来完成,该方法可以从CriteriaQuery本身找到:
query.distinct(true);