It wasn't really a SQL issue: the problem was that you cannot logically order a distinct set of entities by a set of values of which each entity may have several. Translating: each CalendarEvent has several performance dates, so the ordering is impossible.
Unless, of course, you choose one date, which is what you are getting at with your last query where it seems that you are attempting to order by the last (max) performance date. Now we're getting somewhere.
This is possible: see
here. I think what you want can be acheived like so:
Code:
select ce
from CalendarEvent ce
join ce.Performances p
where p between :start and :end
group by <list all ce properties>
order by max( p.Date )
There may also be a way to do this with a joined subquery so that you don't have to list all the properties of CalendarEvent in your group by clause.