2

だから私は次のコードを持っています

    DetachedCriteria subquery = DetachedCriteria.forClass(Component.class);
    subquery.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    subquery.createAlias("files", "files");
    subquery.createAlias("files.review", "review");
    subquery.createAlias("review.observers", "observer", Criteria.LEFT_JOIN);
    subquery.add(Restrictions.or(Restrictions.eq("review.owner", user), Restrictions.eq("observer.id", user.getId())));
    subquery.setProjection(Projections.groupProperty("review.id"));

    DetachedCriteria subquery2 = DetachedCriteria.forClass(ReviewNotification.class);
    subquery2.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    subquery2.add(Subqueries.propertyIn("review", subquery));
    subquery2.add(Restrictions.eq("reviewer", user));
    subquery2.setProjection(Projections.groupProperty("review"));

    Criteria criteria = session.createCriteria(Component.class);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    criteria.createAlias("files", "files");
    criteria.createAlias("files.review", "review");
    criteria.add(Subqueries.propertyIn("review.id", subquery2));

今私の問題は、私が次のことをすると、戻り値として2を得るということです(これは正しいです)

    List<Component> list = (List<Component>) criteria.list();
    for (Component reviewNotification : list) {
        System.out.println(reviewNotification);
    }
    return new Long(list.size());

しかし、私がそうするなら

    criteria.setProjection(Projections.rowCount());
    return (Long) criteria.uniqueResult();

私は4を取得します。

行数が失敗する理由を誰かが知っていますか?

私はちょうど何か他のものを試しました

    criteria.setProjection(Projections.countDistinct("id"));

これも機能します。それで、誰かが何が起こっているのか考えていますか?問題はcriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);から来ていると思います。私は間違っていますか?

助けてくれてありがとう

4

1 に答える 1

1

メソッドsetProjectionがオーバーライドしているようです

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

これは、戻りデータが一意でない理由を説明します

于 2012-12-01T18:36:27.633 に答える