package com.zoowii.jpa_utils;
import com.zoowii.jpa_utils.core.AbstractSession;
import com.zoowii.jpa_utils.core.IWrappedQuery;
import com.zoowii.jpa_utils.core.IWrappedTypedQuery;
import com.zoowii.jpa_utils.core.Transaction;
import com.zoowii.jpa_utils.jdbcorm.sqlmapper.ORMSqlMapper;
import com.zoowii.jpa_utils.jdbcorm.sqlmapper.SqlMapper;
import com.zoowii.jpa_utils.query.ParameterBindings;
import com.zoowii.jpa_utils.util.ListUtil;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Created by zoowii on 14-12-23.
*/
public class HibernateSession extends AbstractSession {
protected final HibernateSessionFactory hibernateSessionFactory;
protected final org.hibernate.Session hibernateSession;
protected SqlMapper sqlMapper = new ORMSqlMapper();
@Override
public int getIndexParamBaseOrdinal() {
return 0;
}
public HibernateSession(HibernateSessionFactory sessionFactory) {
hibernateSessionFactory = sessionFactory;
hibernateSession = hibernateSessionFactory.getHibernateOriginSessionFactory().openSession();
}
public HibernateSession(org.hibernate.Session hibernateSession) {
this.hibernateSession = hibernateSession;
hibernateSessionFactory = null;
}
@Override
public SqlMapper getSqlMapper() {
return sqlMapper;
}
public Transaction getTransaction() {
return new HibernateSessionTransaction(hibernateSession.getTransaction());
}
@Override
public boolean isOpen() {
return hibernateSession.isOpen();
}
@Override
public void close() {
hibernateSession.close();
}
@Override
public void shutdown() {
if (hibernateSessionFactory != null) {
hibernateSessionFactory.close();
}
}
@Override
public void save(Object entity) {
hibernateSession.save(entity);
}
@Override
public void update(Object entity) {
hibernateSession.update(entity);
}
@Override
public void merge(Object entity) {
hibernateSession.merge(entity);
}
@Override
public void detach(Object entity) {
hibernateSession.evict(entity);
}
public void clear() {
hibernateSession.clear();
}
@Override
public void refresh(Object entity) {
hibernateSession.refresh(entity);
}
@Override
public Object find(Class<?> cls, Object id) {
return hibernateSession.get(cls, (Serializable) id);
}
@Override
public void delete(Object entity) {
hibernateSession.delete(entity);
}
@Override
public void flush() {
hibernateSession.flush();
}
@Override
public int executeNativeSql(String sql) {
return executeNativeSql(sql, null);
}
@Override
public int executeNativeSql(String sql, ParameterBindings parameterBindings) {
Query query = hibernateSession.createSQLQuery(sql);
if(parameterBindings != null) {
List<Object> indexedBindings = parameterBindings.getIndexBindings();
for (int i = 0; i < indexedBindings.size();++i) {
query.setParameter(i + 1, indexedBindings.get(i));
}
Map<String, Object> namedBindings = parameterBindings.getMapBindings();
for(String key : namedBindings.keySet()) {
Object value = namedBindings.get(key);
if(value instanceof Collection) {
query.setParameterList(key, (Collection<?>)value);
} else {
query.setParameter(key, value);
}
}
}
return query.executeUpdate();
}
@Override
public int executeQuerySql(String sql) {
return executeQuerySql(sql, null);
}
@Override
public int executeQuerySql(String sql, ParameterBindings parameterBindings) {
Query query = hibernateSession.createQuery(sql);
if(parameterBindings != null) {
List<Object> indexedBindings = parameterBindings.getIndexBindings();
for (int i = 0; i < indexedBindings.size();++i) {
query.setParameter(i + getIndexParamBaseOrdinal(), indexedBindings.get(i));
}
Map<String, Object> namedBindings = parameterBindings.getMapBindings();
for(String key : namedBindings.keySet()) {
Object value = namedBindings.get(key);
if(value instanceof Collection) {
query.setParameterList(key, (Collection<?>)value);
} else {
query.setParameter(key, value);
}
}
}
return query.executeUpdate();
}
@Override
public List findListByQuery(Class<?> cls, String queryString) {
return findListByQuery(cls, queryString, null);
}
@Override
public List findListByQuery(Class<?> cls, String queryString, ParameterBindings parameterBindings) {
Query query = hibernateSession.createQuery(queryString);
if(parameterBindings != null) {
List<Object> indexedBindings = parameterBindings.getIndexBindings();
for (int i = 0; i < indexedBindings.size();++i) {
query.setParameter(i + getIndexParamBaseOrdinal(), indexedBindings.get(i));
}
Map<String, Object> namedBindings = parameterBindings.getMapBindings();
for(String key : namedBindings.keySet()) {
Object value = namedBindings.get(key);
if(value instanceof Collection) {
query.setParameterList(key, (Collection<?>)value);
} else {
query.setParameter(key, value);
}
}
}
return query.list();
}
@Override
public Object findFirstByQuery(Class<?> cls, String queryString) {
Query query = hibernateSession.createQuery(queryString);
query.setMaxResults(1);
return ListUtil.first(query.list());
}
@Override
public Object findSingleByQuery(Class<?> cls, String sql) {
Query query = hibernateSession.createQuery(sql);
query.setMaxResults(1);
return query.uniqueResult();
}
@Override
public List findListByRawQuery(Class<?> cls, String queryString) {
return findListByRawQuery(cls, queryString, null);
}
@Override
public List findListByRawQuery(Class<?> cls, String queryString, ParameterBindings parameterBindings) {
SQLQuery query = hibernateSession.createSQLQuery(queryString);
query.addEntity(cls);
if(parameterBindings != null) {
List<Object> indexedBindings = parameterBindings.getIndexBindings();
for (int i = 0; i < indexedBindings.size();++i) {
query.setParameter(i, indexedBindings.get(i));
}
Map<String, Object> namedBindings = parameterBindings.getMapBindings();
for(String key : namedBindings.keySet()) {
Object value = namedBindings.get(key);
if(value instanceof Collection) {
query.setParameterList(key, (Collection<?>)value);
} else {
query.setParameter(key, value);
}
}
}
return query.list();
}
@Override
public List findListByRawQuery(String queryString) {
SQLQuery query = hibernateSession.createSQLQuery(queryString);
return query.list();
}
@Override
public Object findFirstByRawQuery(Class<?> cls, String queryString) {
return findFirstByRawQuery(cls, queryString, null);
}
@Override
public Object findFirstByRawQuery(Class<?> cls, String queryString, ParameterBindings parameterBindings) {
SQLQuery query = hibernateSession.createSQLQuery(queryString);
query.addEntity(cls);
query.setMaxResults(1);
return ListUtil.first(query.list());
}
@Override
public Object findFirstByRawQuery(String queryString) {
SQLQuery query = hibernateSession.createSQLQuery(queryString);
query.setMaxResults(1);
return ListUtil.first(query.list());
}
@Override
public Object findSingleByRawSql(Class<?> cls, String sql) {
return findSingleByRawSql(cls, sql, null);
}
@Override
public Object findSingleByRawSql(Class<?> cls, String sql, ParameterBindings parameterBindings) {
SQLQuery query = hibernateSession.createSQLQuery(sql);
if(parameterBindings != null) {
List<Object> indexedBindings = parameterBindings.getIndexBindings();
for (int i = 0; i < indexedBindings.size();++i) {
query.setParameter(i, indexedBindings.get(i));
}
Map<String, Object> namedBindings = parameterBindings.getMapBindings();
for(String key : namedBindings.keySet()) {
Object value = namedBindings.get(key);
if(value instanceof Collection) {
query.setParameterList(key, (Collection<?>)value);
} else {
query.setParameter(key, value);
}
}
}
query.addEntity(cls);
query.setMaxResults(1);
return query.uniqueResult();
}
@Override
public Object findSingleByRawSql(String sql) {
SQLQuery query = hibernateSession.createSQLQuery(sql);
query.setMaxResults(1);
return query.uniqueResult();
}
@Override
public IWrappedTypedQuery createQuery(Class<?> cls, String queryString) {
return new HibernateQuery(hibernateSession.createQuery(queryString));
}
@Override
public IWrappedQuery createQuery(String queryString) {
return new HibernateQuery(hibernateSession.createQuery(queryString));
}
}