class QueryObject { private Class klass; private List criteria = new ArrayList(); public Set execute(UnitOfWork uow) { this.uow = uow; return uow.getMapper(klass).findObjectsWhere(generateWhereClause()); }
private String generateWhereClause() { StringBuffer result = new StringBuffer(); for (Iterator it = criteria.iterator(); it.hasNext();) { Criteria c = (Criteria)it.next(); if (result.length()!= 0) result.append("AND"); result.append(c.generateSql(uow.getMapper(klass).getDataMap)); } return result.toString(); } }
class Criteria { private String sqlOperator; protected String field; protected Object value; public static Criteria greaterThan(String fieldName, int value) { return Criteria.greaterThan(fieldName, new Integer(value)); } public static Criteria greaterThan(String fieldName, Object value) { return new Criteria(" > ", fieldName, value); } private Criteria(String sql, String field, Object value) { this.sqlOperator = sql; this.field = field; this.value = value; }
public String generateSql(DataMap dataMap) { return dataMap.getColumnForField(field) + sqlOperator + value; }
public static Criteria matches(String fieldName, String pattern){ return new MatchCriteria(fieldName, pattern); }
}
public class Person{ private String lastName; private String firstName; private int numberOfDependents }
class MatchCriteria extends Criteria{ public String generateSql(DataMap dataMap) { return "UPPER(" + dataMap.getColumnForField(field) + ") LIKE UPPER('" + value + "')"; } }
class Mapper {
public Set findObjectsWhere (String whereClause) { String sql = "SELECT" + dataMap.columnList() + " FROM " + dataMap.getTableName() + " WHERE " + whereClause; PreparedStatement stmt = null; ResultSet rs = null; Set result = new HashSet(); try { stmt = DB.prepare(sql); rs = stmt.executeQuery(); result = loadAll(rs); } catch (Exception e) { throw new ApplicationException (e); } finally {DB.cleanUp(stmt, rs); } return result; } }
class DataMap {
public String getColumnForField (String fieldName) { for (Iterator it = getColumns(); it.hasNext();) { ColumnMap columnMap = (ColumnMap)it.next(); if (columnMap.getFieldName().equals(fieldName)) return columnMap.getColumnName(); } throw new ApplicationException ("Unable to find column for " + fieldName); } }
public class Client{
public static void main(String []args){ QueryObject query = new QueryObject(Person.class); query.addCriteria(Criteria.greaterThan("numberOfDependents", 0)); UnitOfWork uow = new UnitOfWork(); query.execute(uow); } }
|