package com.idega.core.persistence.impl; import java.util.Arrays; import java.util.Collection; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.idega.core.business.DefaultSpringBean; import com.idega.core.persistence.DaoFunctions; import com.idega.core.persistence.Param; import com.idega.util.CoreUtil; /** * @author <a href="mailto:civilis@idega.com">Vytautas Čivilis</a> * @version $Revision: 1.1 $ Last modified: $Date: 2009/04/16 08:36:53 $ by $Author: civilis $ */ @Scope(BeanDefinition.SCOPE_PROTOTYPE) @Service(QueryInlineImpl.beanIdentifier) public class QueryInlineImpl extends DefaultSpringBean implements com.idega.core.persistence.Query { public static final String beanIdentifier = "QueryInlineImpl"; @PersistenceContext private EntityManager entityManager; protected Query query; private String queryExpression; private String mappingName; private Class<?> expectedReturnType; private Integer maxResults; private Integer firstResult; @Autowired private DaoFunctions daoFunctions; @Override @Transactional(readOnly = true) public <Expected> List<Expected> getResultList(Class<Expected> expectedReturnType, Param... params) { setExpectedReturnType(expectedReturnType); boolean measure = CoreUtil.isSQLMeasurementOn(); long start = measure ? System.currentTimeMillis() : 0; try { return getDaoFunctions().getResultListByQuery(getQuery(), expectedReturnType, params); } finally { if (measure) { long end = System.currentTimeMillis(); getLogger().info("Query '" + getQueryExpression() + "' with parameters " + Arrays.asList(params) + " executed in " + (end - start) + " ms"); } } } @Override @Transactional(readOnly = true) public <Expected> List<Expected> getResultList(Class<Expected> expectedReturnType, String mappingName, Param... params) { setMappingName(mappingName); setExpectedReturnType(expectedReturnType); boolean measure = CoreUtil.isSQLMeasurementOn(); long start = measure ? System.currentTimeMillis() : 0; try { return getDaoFunctions().getResultListByQuery(getQuery(), expectedReturnType, params); } catch (Exception e) { CoreUtil.sendExceptionNotification("Error executing query: " + getQueryExpression() + " with parameters: " + Arrays.asList(params), e); throw new RuntimeException(e); } finally { if (measure) { long end = System.currentTimeMillis(); getLogger().info("Query '" + getQueryExpression() + "' with parameters " + Arrays.asList(params) + " executed in " + (end - start) + " ms"); } } } @Override @Transactional(readOnly = true) public <Expected> Expected getSingleResult(Class<Expected> expectedReturnType, String mappingName, Param... params) { setMappingName(mappingName); setExpectedReturnType(expectedReturnType); boolean measure = CoreUtil.isSQLMeasurementOn(); long start = measure ? System.currentTimeMillis() : 0; try { return getDaoFunctions().getSingleResultByQuery(getQuery(), expectedReturnType, params); } catch (NoResultException e) { return null; } finally { if (measure) { long end = System.currentTimeMillis(); getLogger().info("Query '" + getQueryExpression() + "' with parameters " + Arrays.asList(params) + " executed in " + (end - start) + " ms"); } } } @Override @Transactional(readOnly = true) public <Expected> Expected getSingleResult(Class<Expected> expectedReturnType, Param... params) { setExpectedReturnType(expectedReturnType); boolean measure = CoreUtil.isSQLMeasurementOn(); long start = measure ? System.currentTimeMillis() : 0; try { return getDaoFunctions().getSingleResultByQuery(getQuery(), expectedReturnType, params); } catch (NoResultException e) { return null; } finally { if (measure) { long end = System.currentTimeMillis(); getLogger().info("Query '" + getQueryExpression() + "' with parameters " + Arrays.asList(params) + " executed in " + (end - start) + " ms"); } } } protected Query getQuery() { if (query == null) { if (getMappingName() != null) { getLogger().warning("Mapping name set for hql inline query. This can't be used, ignoring"); } query = getEntityManager().createQuery(getQueryExpression()); if (getMaxResults() != null) query.setMaxResults(getMaxResults()); if (getFirstResult() != null) query.setFirstResult(getFirstResult()); } return query; } public void setQuery(Query query) { this.query = query; } EntityManager getEntityManager() { return entityManager; } protected Class<?> getExpectedReturnType() { return expectedReturnType; } protected String getMappingName() { return mappingName; } protected void setExpectedReturnType(Class<?> expectedReturnType) { this.expectedReturnType = expectedReturnType; } protected void setMappingName(String mappingName) { this.mappingName = mappingName; } protected String getQueryExpression() { return queryExpression; } @Override public void setQueryExpression(String queryExpression) { this.queryExpression = queryExpression; } protected DaoFunctions getDaoFunctions() { return daoFunctions; } protected Integer getMaxResults() { return maxResults; } protected Integer getFirstResult() { return firstResult; } @Override public void setMaxResults(Integer maxResults) { this.maxResults = maxResults; } @Override public void setFirstResult(Integer firstResult) { this.firstResult = firstResult; } @Override @Transactional(readOnly = true) public <Expected> List<Expected> getResultList(Class<Expected> expectedReturnType, Collection<Param> params) { setExpectedReturnType(expectedReturnType); boolean measure = CoreUtil.isSQLMeasurementOn(); long start = measure ? System.currentTimeMillis() : 0; try { return getDaoFunctions().getResultListByQuery(getQuery(), expectedReturnType, params); } finally { if (measure) { long end = System.currentTimeMillis(); getLogger().info("Query '" + getQueryExpression() + "' with parameters " + params + " executed in " + (end - start) + " ms"); } } } @Override @Transactional(readOnly = true) public void executeUpdate(Param... params) { Query query = getQuery(); if (params != null) for (Param param : params) { query.setParameter(param.getParamName(), param.getParamValue()); } query.executeUpdate(); } }