you're almost there; add_entity has an "alias" argument:
session.query(User).\
select_from(users.join(Address_1).join(Address_2)).\
filter(Address_1.c.email_address>Address_2.c.email_address).\
add_entity(Address, alias=Address_1)
Also, you can't use it here since you are comparing between the two
address aliases, but in general you can also create aliases with
join() using join('addresses', aliased=True); subsequent filter()
criterion using the plain Address.table will be adapted to the alias
used in the most recent join. This would allow you to use the Address
class as a base for filter criterion also.
It also would be quite easy for us to add a helper option here to
join(), such that you could say query.join('addresses',
with_aliases=[Address_1])...I was thinking of that just today.
(with_aliases is a list to support query.join(['foo','bar', 'bat']))