package util.dao; import java.util.Set; import org.hibernate.Query; import org.hibernate.Session; import dao.DataAccessException; import dao.PatientsDao; import entity.Doctor; import entity.Patient; public class PatientDaoHibernate extends GenericDaoHibernate<Patient> implements PatientsDao{ private static PatientDaoHibernate instance; public static PatientDaoHibernate getInstance() { if (instance == null) { instance = new PatientDaoHibernate(Patient.class); } return instance; } protected PatientDaoHibernate(Class<Patient> pojoClass) { super(pojoClass); } @Override public Set<Patient> findAllByDoctor(final Doctor doctor) throws DataAccessException { return findByCallback(new DaoCallBackVisitor() { @Override public Query visit(Session session) { Query query = session.createQuery("select p from Patient p inner join p.visits v where v.doctor.id = :id"); query.setLong("id", doctor.getId()); return query; } }); } @Override public Set<Patient> findAllByDiagnose(final String diagnose) throws DataAccessException { return findByCallback(new DaoCallBackVisitor() { @Override public Query visit(Session session) { String searchDiagnose = diagnose; Query query = session.createQuery("select p from Patient p inner join p.visits v where v.diagnose like :diagnose escape '\\'"); searchDiagnose = searchDiagnose.replace("\\", "\\\\"); searchDiagnose = searchDiagnose.replace("%", "\\%"); searchDiagnose = searchDiagnose.replace("_", "\\_"); query.setString("diagnose", "%" + searchDiagnose + "%"); return query; } }); } @Override public Set<Patient> findAllWithExpensiveVisit(final double visitCostsAtLeast) throws DataAccessException { return findByCallback(new DaoCallBackVisitor() { @Override public Query visit(Session session) { Query query = session.createQuery("select p from Patient p inner join p.visits v where v.price > :price"); query.setDouble("price", visitCostsAtLeast); return query; } }); } }