1) This isn't the sort of thing that hibernate was designed for, so doing it easily isn't easy (heh). If you load an object with a collection, hibernate is treating it as an object, not a result row with a dependent result set: while you can ignore the dependent result set when you're working with SQL, the java object unconditionally has that collection, it's part of the object. You're probably thinking too close to the DB if you want hibernate to return DB rows transformed into POJOs: hibernate wants to return POJOs that happened to have been persisted to a DB.
I don't believe that your example can be correctly modelled using "normal" HQL or criteria, but you can do it using the select new syntax:
Code:
select new Ent1(param1, param2, param3) from ent1 e where e.name=:Name
Hibernate won't fill in anything you don't want it to, when you're using the select new syntax.
2) I don't believe so, but you can get part way there using the .class feature:
Code:
from ent e
left join fetch e.values v
where v.class = 'LangValueDiscriminator'
Then do the rest in java. Obviously this doesn't work if you're using an inheritance technique that doesn't use discriminators (e.g. joined-subclass).