package eu.eudat.data.query.definition; import eu.eudat.data.dao.criteria.Criteria; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.queryableentity.DataEntity; public abstract class Query, T extends DataEntity> implements CriteriaQuery { private C criteria; private QueryableList query; public static class QueryBuilder, T extends DataEntity, Q extends Query> { private C criteria; private QueryableList query; private Class tClass; public QueryBuilder(Class tClass) { this.tClass = tClass; } public QueryBuilder criteria(C criteria) { this.criteria = criteria; return this; } public QueryBuilder query(QueryableList query) { this.query = query; return this; } public Q build() { try { Q q = tClass.newInstance(); q.setCriteria(criteria); q.setQuery(query); return q; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } } public QueryableList getQuery() { return query; } public void setQuery(QueryableList query) { this.query = query; } public C getCriteria() { return criteria; } public void setCriteria(C criteria) { this.criteria = criteria; } @Override public QueryableList collect() { return this.applyCriteria(); } @Override public QueryableList collect(QueryableList repo) { this.query = repo; return this.applyCriteria(); } }