/* * Copyright (c) 2005-2011 Grameen Foundation USA * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * See also http://www.apache.org/licenses/LICENSE-2.0.html for an * explanation of the license and how it is applied. */ package org.mifos.accounts.savings.persistence; import java.util.Iterator; import java.util.List; import java.util.Map; import org.hibernate.Hibernate; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.proxy.HibernateProxy; import org.hibernate.transform.Transformers; import org.mifos.core.MifosRuntimeException; import org.mifos.framework.components.audit.util.helpers.AuditInterceptor; import org.mifos.framework.hibernate.helper.StaticHibernateUtil; /** * */ public class GenericDaoHibernate implements GenericDao { @SuppressWarnings("unchecked") @Override public final List<? extends Object> executeNamedQueryWithResultTransformer(final String queryName, final Map<String, ?> nameQueryParameters, final Class<?> className) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName).setResultTransformer(Transformers.aliasToBean(className)); query.setProperties(nameQueryParameters); return query.list(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @Override public final Object executeUniqueResultNamedQueryWithResultTransformer(final String queryName, final Map<String, ?> nameQueryParameters, final Class<?> className) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName).setResultTransformer(Transformers.aliasToBean(className)); query.setProperties(nameQueryParameters); return query.uniqueResult(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @SuppressWarnings("unchecked") @Override public final List<? extends Object> executeNamedQuery(final String queryName, final Map<String, ?> queryParameters) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName); query.setProperties(queryParameters); return query.list(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @SuppressWarnings("unchecked") @Override public final List<? extends Object> executeNamedQueryWithOffset(final String queryName, final Map<String, ?> queryParameters,int position,int noOfObjects) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName); query.setProperties(queryParameters); query.setFirstResult(position); query.setMaxResults(noOfObjects); return query.list(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @SuppressWarnings("unchecked") @Override public final List<? extends Object> executeNamedQueryWithOffsetAndOrderAppend(final String queryName, final Map<String, ?> queryParameters,int position,int noOfObjects) { try { Session session = getSession(); StringBuilder stringBuilder = new StringBuilder(session.getNamedQuery(queryName).getQueryString()); stringBuilder.append(" ORDER BY "); stringBuilder.append(queryParameters.get("ordering")); Query query = session.createQuery(stringBuilder.toString()); query.setProperties(queryParameters); query.setFirstResult(position); query.setMaxResults(noOfObjects); return query.list(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @SuppressWarnings("unchecked") @Override public final int executeNamedQueryDelete(final String queryName, final Map<String, ?> queryParameters) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName); query.setProperties(queryParameters); return query.executeUpdate(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @SuppressWarnings("unchecked") @Override public final Iterator<? extends Object> executeNamedQueryIterator(final String queryName, final Map<String, ?> queryParameters) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName); query.setProperties(queryParameters); return query.iterate(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @Override public final Object executeUniqueResultNamedQuery(final String queryName, final Map<String, ?> queryParameters) { try { Session session = getSession(); Query query = session.getNamedQuery(queryName); query.setProperties(queryParameters); return query.uniqueResult(); } catch (Exception e) { throw new MifosRuntimeException(e); } } @Override public void delete(final Object entity) { Session session = getSession(); try { session.delete(entity); } catch (Exception he) { throw new MifosRuntimeException(he); } } @Override public final void createOrUpdate(final Object entity) { try { Session session = getSession(); session.saveOrUpdate(entity); AuditInterceptor interceptor = (AuditInterceptor) StaticHibernateUtil.getInterceptor(); if (interceptor.isAuditLogRequired()) { interceptor.createChangeValueMap(entity); } } catch (Exception e) { throw new MifosRuntimeException(e); } } @Override public final void update(final Object entity) { try { Session session = getSession(); session.update(entity); AuditInterceptor interceptor = (AuditInterceptor) StaticHibernateUtil.getInterceptor(); if (interceptor.isAuditLogRequired()) { interceptor.createChangeValueMap(entity); } } catch (Exception e) { throw new MifosRuntimeException(e); } } @Override public final Query createQueryForUpdate(String hql) { Session session = StaticHibernateUtil.getSessionTL(); return session.createQuery(hql); } @Override // NOTE: This is temporary, should be removed once we move to spring managed transaction public Session getSession() { return StaticHibernateUtil.getSessionTL(); } // useful if casting is required to make sure we don't try to cast a proxied object. @Override public <T> T initializeAndUnproxy(T var) { if (var == null) { return null; } Hibernate.initialize(var); if (var instanceof HibernateProxy) { var = (T) ((HibernateProxy) var).getHibernateLazyInitializer().getImplementation(); } return var; } }