@Override public ArrayList<V> select(String query, HashMap variables) { clearSignals(); ArrayList results = new ArrayList(); V value; K key; ResultSet rs = null; Connection con = null; PreparedStatementFactory psf = new PreparedStatementFactory(variables); PreparedStatement ps = null; try { con = ds.getConnection(); if (con.isClosed()) { if (logger.isWarnEnabled()) logger.warn("Connection is closed: GenericDAO.select!"); throw new SQLException(); } ps = con.prepareStatement(query); ps = psf.generate(ps); // enter variables here! logger.debug("query is..." + ps.toString()); key = (K) ps.toString(); if ((results = (V) cache.get(key)) == null) { rs = ps.executeQuery(); results = this.processResultRows(rs); if (results != null) { cache.put(key, results); } } // if (logger.isInfoEnabled()) { logger.debug("Executing dynamic query, EntityDAO.select:query " + query); // } signalSuccess(); } catch (SQLException sqle) { signalFailure(sqle); if (logger.isWarnEnabled()) { logger.warn( "Exception while executing dynamic query, GenericDAO.select: " + query + ":message: " + sqle.getMessage()); sqle.printStackTrace(); } } finally { this.closeIfNecessary(con, rs, ps); } return results; }