[hibernate-dev] 6.0 - ResultTransformer

Vlad Mihalcea mihalcea.vlad at gmail.com
Mon Sep 12 07:09:14 EDT 2016


Sure. I've used it recently to group a tree-like structure as follows:

public class PostCommentScoreResultTransformer
    implements ResultTransformer {

    private Map<Long, PostCommentScore> postCommentScoreMap = new
HashMap<>();

    private List<PostCommentScore> roots = new ArrayList<>();

    @Override
    public Object transformTuple(Object[] tuple, String[] aliases) {
        PostCommentScore commentScore = (PostCommentScore) tuple[0];
        Long parentId = commentScore.getParentId();
        if (parentId == null) {
            roots.add(commentScore);
        } else {
            PostCommentScore parent = postCommentScoreMap.get(parentId);
            if (parent != null) {
                parent.addChild(commentScore);
            }
        }
        postCommentScoreMap.putIfAbsent(commentScore.getId(), commentScore);
        return commentScore;
    }

    @Override
    public List transformList(List collection) {
        return roots;
    }
}

The results were fetched using a Recursive CTE and I wanted the results to
be assembled back in a N-level hierarchy, starting from a Root node.

On Mon, Sep 12, 2016 at 1:58 PM, Steve Ebersole <steve at hibernate.org> wrote:

> The former though is specifically what I see no use for.  Do you have a
> specific use case in mind that cannot be addressed by other mechanisms
> (Tuple, dynamic-instantiation,  etc)?
>
> On Mon, Sep 12, 2016, 12:38 AM Vlad Mihalcea <mihalcea.vlad at gmail.com>
> wrote:
>
>> Hi,
>>
>> We definitely need to address the ResultTranformer.
>> Only the former method is what we should be exposing, the latter being
>> used only in one particular use case, so that should be addressed by a
>> different contract.
>>
>> This way we could provide a ResultTransformer using a lambda, which is
>> not possible today.
>>
>> Vlad
>>
>> On Mon, Sep 12, 2016 at 5:49 AM, Steve Ebersole <steve at hibernate.org>
>> wrote:
>>
>>> Another legacy concept I'd like to revisit as we move to 6.0 is the
>>> Hibernate ResultTransformer.  I'd argue that ResultTransformer is no
>>> longer
>>> needed, especially in it's current form.
>>>
>>> Specifically, ResultTransformer defines 2 distinct ways to transform the
>>> results of a query:
>>>
>>>    1. `#transformTuple` - this method operates on each "row" of the
>>> result,
>>
>>
>>>    allowing the user to transform the Object[] into some other structure.
>>>    This is specifically the one I see no value in moving forward.
>>> Between
>>>    dynamic-instantiation, Tuple-handling, etc I think users have the
>>> needed
>>>    capabilities to transform the query result tuples.
>>>
>>    2. `#transformList` - this one operates on the query result as a whole
>>
>>
>>>    (unless scroll/iterate are used).  This method at least adds
>>> something that
>>>    cannot be done in another way.   But I'd still personally question its
>>>    overall usefulness.
>>>
>>> Does anyone have an argument for continuing to support either of these?
>>> Personally, I propose just dropping the ResultTransformer support
>>> altogether.
>>>
>> _______________________________________________
>>> hibernate-dev mailing list
>>> hibernate-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>
>>
>>


More information about the hibernate-dev mailing list