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());
  ...
  ...
 }
}