/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.store.dao;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.enonic.cms.store.support.EntityPageList;
public abstract class AbstractBaseEntityDao<T>
implements EntityDao<T>
{
private HibernateTemplate hibernateTemplate;
protected final <T> T get( Class<T> clazz, Serializable key )
{
return typecast( clazz, getHibernateTemplate().get( clazz, key ) );
}
protected final <T> List<T> findByExample( Class<T> clazz, Object example )
{
return typecastList( clazz, getHibernateTemplate().findByExample( example ) );
}
protected final <T> List<T> findByNamedQuery( Class<T> clazz, String queryName )
{
return typecastList( clazz, getHibernateTemplate().findByNamedQuery( queryName ) );
}
protected final <T> List<T> findByNamedQuery( Class<T> clazz, String queryName, String name, Object value )
{
return typecastList( clazz, getHibernateTemplate().findByNamedQueryAndNamedParam( queryName, name, value ) );
}
protected final <T> List<T> findByNamedQuery( Class<T> clazz, String queryName, String[] nameList, Object[] valueList )
{
return typecastList( clazz, getHibernateTemplate().findByNamedQueryAndNamedParam( queryName, nameList, valueList ) );
}
protected final <T> T findSingleByNamedQuery( Class<T> clazz, String queryName )
{
List<T> list = findByNamedQuery( clazz, queryName );
return list.isEmpty() ? null : list.get( 0 );
}
protected final <T> T findSingleByNamedQuery( Class<T> clazz, String queryName, String name, Object value )
{
List<T> list = findByNamedQuery( clazz, queryName, name, value );
checkSingleResult( list, queryName );
return list.isEmpty() ? null : list.get( 0 );
}
protected final <T> T findFirstByNamedQuery( Class<T> clazz, String queryName, String name, Object value )
{
List<T> list = findByNamedQuery( clazz, queryName, name, value );
return list.isEmpty() ? null : list.get( 0 );
}
protected final <T> T findSingleByNamedQuery( Class<T> clazz, String queryName, String[] nameList, Object[] valueList )
{
List<T> list = findByNamedQuery( clazz, queryName, nameList, valueList );
checkSingleResult( list, queryName );
return list.isEmpty() ? null : list.get( 0 );
}
protected final <T> T executeSingleResult( Class<T> clazz, HibernateCallback callback )
{
return typecast( clazz, getHibernateTemplate().execute( callback ) );
}
protected final <T> List<T> executeListResult( Class<T> clazz, HibernateCallback callback )
{
return typecastList( clazz, getHibernateTemplate().execute( callback ) );
}
@SuppressWarnings("unchecked")
private <T> T typecast( Class<T> clazz, Object value )
{
return (T) value;
}
@SuppressWarnings("unchecked")
private <T> List<T> typecastList( Class<T> clazz, Object list )
{
return (List<T>) list;
}
private void checkSingleResult( List list, String queryName )
{
if ( list.size() > 1 )
{
throw new IllegalStateException( "Expected a single row while running query '" + queryName + "', got: " + list.size() );
}
}
public void storeNew( T entity )
{
if ( entity == null )
{
throw new IllegalArgumentException( "Given entity cannot be null" );
}
getHibernateTemplate().save( entity );
}
public void storeNew( List<T> entities )
{
if ( entities == null )
{
throw new IllegalArgumentException( "Given entities cannot be null" );
}
for ( T entity : entities )
{
getHibernateTemplate().save( entity );
}
}
public void updateExisting( T entity )
{
if ( entity == null )
{
throw new IllegalArgumentException( "Given entity cannot be null" );
}
getHibernateTemplate().update( entity );
}
public void updateExisting( List<T> entities )
{
if ( entities == null )
{
throw new IllegalArgumentException( "Given entities cannot be null" );
}
for ( T entity : entities )
{
getHibernateTemplate().update( entity );
}
}
public void store( T entity )
{
getHibernateTemplate().saveOrUpdate( entity );
}
public void storeAll( List<T> entities )
{
getHibernateTemplate().saveOrUpdateAll( entities );
}
/**
* Deletes the specified object from the database.
*
* @param entity A Hibernate persisted object to be deleted.
*/
public void delete( T entity )
{
getHibernateTemplate().delete( entity );
}
public final void flush()
{
getHibernateTemplate().flush();
}
public void refresh( T object )
{
getHibernateTemplate().refresh( object );
}
public void evict( T object )
{
getHibernateTemplate().evict( object );
}
/*
JSI 23.11.2016 - No longer in use after CMS-5431? Can probably be deleted.
*/
public int deleteByNamedQuery( final String queryName, final String[] paramNames, final Object[][] paramValues )
{
return ( (Number) getHibernateTemplate().execute( new HibernateCallback()
{
public Object doInHibernate( Session session )
throws HibernateException, SQLException
{
Query query = session.getNamedQuery( queryName );
if ( paramNames != null )
{
for ( int i = 0; i < paramNames.length; i++ )
{
query.setParameterList( paramNames[i], paramValues[i] );
}
}
return query.executeUpdate();
}
} ) ).intValue();
}
public int deleteByNamedQuery( final String queryName, String paramName, Object paramValue )
{
return executeByNamedQuery( queryName, paramName != null ? new String[]{paramName} : null,
paramValue != null ? new Object[]{paramValue} : null );
}
private int executeByNamedQuery( final String queryName, final String[] paramNames, final Object[] paramValues )
{
return ( (Number) getHibernateTemplate().execute( new HibernateCallback()
{
public Object doInHibernate( Session session )
throws HibernateException, SQLException
{
Query query = session.getNamedQuery( queryName );
if ( paramNames != null )
{
for ( int i = 0; i < paramNames.length; i++ )
{
query.setParameter( paramNames[i], paramValues[i] );
}
}
return query.executeUpdate();
}
} ) ).intValue();
}
public HibernateTemplate getHibernateTemplate()
{
return hibernateTemplate;
}
@Autowired
public final void setHibernateTemplate( HibernateTemplate value )
{
hibernateTemplate = value;
}
protected final EntityPageList<T> findPageList( Class<T> clz, String filter, int index, int count )
{
final int totalCount = findTotalCount( clz, filter );
final List<T> list = findPageItems( clz, filter, index, count );
return new EntityPageList<T>( index, totalCount, list );
}
private int findTotalCount( Class<T> clz, String filter )
{
final StringBuffer hql = new StringBuffer( "select count(x) from " );
hql.append( clz.getName() ).append( " x" );
if ( filter != null )
{
hql.append( " where " ).append( filter );
}
final Query query = createQuery( hql.toString() );
return ( (Number) query.list().get( 0 ) ).intValue();
}
@SuppressWarnings("unchecked")
private List<T> findPageItems( Class<T> clz, String filter, int index, int count )
{
final StringBuffer hql = new StringBuffer( "select x from " );
hql.append( clz.getName() ).append( " x" );
if ( filter != null )
{
hql.append( " where " ).append( filter );
}
final Query query = createQuery( hql.toString() );
query.setFirstResult( index );
query.setMaxResults( count );
return (List<T>) query.list();
}
private Query createQuery( final String query )
{
return this.hibernateTemplate.execute( new HibernateCallback<Query>()
{
public Query doInHibernate( Session session )
throws HibernateException, SQLException
{
return session.createQuery( query );
}
} );
}
}