As Stefan said, it's hard to answer your question without seeing your mappings and query. However, "llegal attempt to dereference collection" is usually caused by query trying to reference collection element properties directly. In other words, something like
from T1 as t1 where t1.t2set.prop1 = 1
would cause the above error, whereas
from T1 as t1 left join fetch t1.t2set as t2 where t2.prop1 = 1
would not. In your case if you want to get T1, T2 and T3 back as a single select you'll need to write something like
from T1 as t1
left join fetch t1.t2set as t2
left join fetch t2.t3
where t1.prop = :value
Keep in mind that above select may return multiple instances of T1 (e.g. if you have 3 T1s satisfying your conditions with 4 T2 linked to each you'll get back 3*4 = 12 records). You'll need to wrap them in a Set to eliminate duplicates.
As far as "countless" queries go, the best approach depends heavily on your specific circumstances. If you map T2->T3 association as eager, you'll get N+1 selects when attempting to retrieve given T1 for the first time. Afterwards, depending on whether you use the same session / cache / etc... you may get 2, 1 or even 0 selects. OTOH, anything retrieved via fetch query like above can only be cached via query means which in most cases won't help.