[hibernate-dev] 6.0 - ResultTransformer

Steve Ebersole steve at hibernate.org
Mon Sep 12 07:36:53 EDT 2016


So your example actually leverages both methods...  Well technically it
only really needs the latter method (#transformList); you could have done
all that work there - the elements of the passed collection would be the
individual tuples.




On Mon, Sep 12, 2016 at 6:09 AM Vlad Mihalcea <mihalcea.vlad at gmail.com>
wrote:

> 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