/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.orm.query; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.cayenne.DataRow; import org.apache.cayenne.access.DataContext; import com.aimluck.eip.orm.Database; public class SQLTemplate<M> extends AbstractQuery<M> { protected org.apache.cayenne.query.SQLTemplate delegate; protected Map<String, Object> parameters = new HashMap<String, Object>(); public SQLTemplate(Class<M> rootClass, String sql) { super(rootClass); delegate = new org.apache.cayenne.query.SQLTemplate(rootClass, sql); delegate.setFetchingDataRows(true); dataContext = DataContext.getThreadDataContext(); } public SQLTemplate(DataContext dataContext, Class<M> rootClass, String sql) { super(dataContext, rootClass); delegate = new org.apache.cayenne.query.SQLTemplate(rootClass, sql); delegate.setFetchingDataRows(true); this.dataContext = dataContext; } public void execute() { Database.beginTransaction(dataContext); delegate.setParameters(parameters); dataContext.performQuery(delegate); Database.commit(dataContext); } @Override public List<M> fetchList() { Database.beginTransaction(dataContext); delegate.setParameters(parameters); @SuppressWarnings("unchecked") List<org.apache.cayenne.DataRow> dataRows = dataContext.performQuery(delegate); List<M> results = new ArrayList<M>(dataRows.size()); for (org.apache.cayenne.DataRow dataRow : dataRows) { M model = newInstanceFromRowData(dataRow, rootClass); if (model != null) { results.add(model); } } return results; } @SuppressWarnings("unchecked") public List<DataRow> fetchListAsDataRow() { Database.beginTransaction(dataContext); delegate.setParameters(parameters); return dataContext.performQuery(delegate); } public SQLTemplate<M> pageSize(int pageSize) { delegate.setPageSize(pageSize); return this; } public SQLTemplate<M> limit(int limit) { delegate.setFetchLimit(limit); return this; } public SQLTemplate<M> param(String key, Object value) { parameters.put(key, value); return this; } public org.apache.cayenne.query.SQLTemplate getSQLTemplate() { return delegate; } }