[hibernate-dev] 6.0 - ResultTransformer
Steve Ebersole
steve at hibernate.org
Mon Sep 12 19:33:11 EDT 2016
If we are going to support #transformTuple (in whatever form) we need to
decide on a precedence between that, resultClass, dynamic-instantiation, etc
Specifically, what is the meaning of:
session.createQuery( "select new DTO(...) ...", DTO.class )
.setTupleTransformer( () -> ... )
...
And what if they dont match necessarily, like:
session.createQuery( "select new DTO(...) ...", Tuple.class )
.setTupleTransformer( () -> ... )
On Mon, Sep 12, 2016 at 9:17 AM Steve Ebersole <steve at hibernate.org> wrote:
> Gail, IIRC one of these methods causes problems with regards to query
> result caching. Do I remember that correctly? And if so, do you remember
> which one? I'd guess #transformTuples, but I forget the details.
>
>
> On Mon, Sep 12, 2016 at 6:36 AM Steve Ebersole <steve at hibernate.org>
> wrote:
>
>> 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