I might be missing something, but wouldn't this work?
Code:
public abstract class GenericUser {
private String userName;
public String getUserName() { ... }
public void setUserName() { ... }
}
// Then, for an application specific user
public class ApplicationAUser extends GenericUser {
private String firstName;
private String lastName;
...
...
}
Then, in your DAO
Code:
public class SomeDAO {
public boolean isEmailSent(GenericUser user, EmailThing email) {
Session session = ...;
Query query = session.createQuery("select count(*) from UserEmailThing et where et.user.name = :userName and et.email.id = :emailID");
query.setString("userName", user.getUserName());
...
...
}
}