It is unclear what field of "address" you use to establish the max(). Suppose it is called "addnum"
Create a criteria query joining the two tables, add a projection "max" for that field, and list all the remaining fields you are interested in as "groupProperties" (equivalent to a "group by" in regular SQL).
Code:
Criteria crit=session.createCriteria(Person.class);
crit.createAlias("addresses", "b");
crit.setProjection(Projections.projectionList()
.add(Projections.max("b.addnum"))
.add(Projections.groupProperty("name"))
.add(Projections.groupProperty("address1"))
.add(Projections.groupProperty("address2"))
);
crit.list();