Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中防止重复结果?_Java_Hibernate_Criteria_Hibernate Criteria - Fatal编程技术网

Java 如何在Hibernate中防止重复结果?

Java 如何在Hibernate中防止重复结果?,java,hibernate,criteria,hibernate-criteria,Java,Hibernate,Criteria,Hibernate Criteria,尝试搜索关系的多个值时,将返回重复的结果 我怎样才能避免这些重复 我们的服务中有一种方法,用于构建标准: @Override protected Criteria createCriteria(Map<String, Object> values) { Criteria criteria = super.createCriteria(values); if (criteria != null && values != null) {

尝试搜索关系的多个值时,将返回重复的结果

我怎样才能避免这些重复

我们的服务中有一种方法,用于构建
标准

@Override
protected Criteria createCriteria(Map<String, Object> values) {
    Criteria criteria = super.createCriteria(values);
    if (criteria != null && values != null) {

        // other criteria restrictions

        Set<MDTErkenning> erkenningen = (Set<MDTErkenning>) values.get("erkenningen");
        if (erkenningen != null && !erkenningen.isEmpty()) {
            criteria.createAlias("erkenningen", "erkenningen");
            criteria.add(Restrictions.in("erkenningen." + CollectionPropertyNames.COLLECTION_ELEMENTS, erkenningen));
        }

    }
    return criteria;
}
包含一些数据的联接表
mdt\u erkenning

------------------------
| mdt_uuid | erkenning |
------------------------
| <id 1>   | ZORG      |
| <id 1>   | PAB       |
| <id 2>   | ZORG      |
| <id 2>   | IMB       |
------------------------
------------------------
|mdt|u uuid|erkenning|
------------------------
||佐尔格|
|| PAB|
||佐尔格|
|| IMB|
------------------------
因此,如果我查询例如ZORG和PAB,我会得到我的实体的3个实例:2个带有
,1个带有

我想把结果列表放在
集合中
以消除重复项,但是分页不再正确


我应该怎么做?

尝试添加
setResultTransformer(Criteria.DISTINCT\u ROOT\u ENTITY)
以删除重复条目和
setProjection(Projections.DISTINCT(Projections.property(“id”))
以在创建Criteria对象时获得正确的行数。

尝试使用此投影:

.setProjection(Projections.countDistinct("id"))
例如:

@Override
public Long getCount(Map<String, Object> values) {
    Criteria criteria = createCriteria(values).setProjection(Projections.countDistinct("id"));
    return (Long) criteria.uniqueResult();
}
@覆盖
公共长getCount(映射值){
Criteria=createCriteria(values).setProjection(Projections.countDistinct(“id”));
返回(长)条件。uniqueResult();
}

我正在使用Hibernate 4.3.6.Final。

我知道这是一个旧线程,但在某些情况下,如果有人仍然存在此问题,这对我来说是有效的。更多细节

公共列表getUserByUsername(字符串用户名)
{  
Session Session=sessionFactory.getCurrentSession();
返回会话.createCriteria(User.class)
.add(Restrictions.eq(“用户名”,username))
.setResultTransformer(标准.DISTINCT\u ROOT\u实体)
.list();
}  

不起作用:删除重复项,但计数仍然错误。仍然不起作用:
createCriteria(值)。setProjection(Projections.distinct(Projections.property(“id”))。setProjection(Projections.rowCount())。uniqueResult()返回3。
------------------------
| mdt_uuid | erkenning |
------------------------
| <id 1>   | ZORG      |
| <id 1>   | PAB       |
| <id 2>   | ZORG      |
| <id 2>   | IMB       |
------------------------
.setProjection(Projections.countDistinct("id"))
@Override
public Long getCount(Map<String, Object> values) {
    Criteria criteria = createCriteria(values).setProjection(Projections.countDistinct("id"));
    return (Long) criteria.uniqueResult();
}
 public List<User> getUserByUsername (String username)  
    {  
        Session session = sessionFactory.getCurrentSession();  
        return session.createCriteria(User.class)  
          .add(Restrictions.eq("username", username))  
          .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)  
          .list();  
    }