All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.net.vidyo.yd.common.data.dao.CommonJpaRepositoryImpl Maven / Gradle / Ivy

package cn.net.vidyo.yd.common.data.dao;

import org.hibernate.annotations.Table;
import org.hibernate.query.internal.NativeQueryImpl;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.core.RepositoryInformation;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.lang.annotation.Annotation;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;


@NoRepositoryBean
@Transactional
public class CommonJpaRepositoryImpl extends SimpleJpaRepository implements CommonJpaRepository {
    @Autowired
    EntityManager entityManager;
    Class entityClass;
    RepositoryInformation repositoryInformation;

    public CommonJpaRepositoryImpl(Class entityClass, EntityManager entityManager, RepositoryInformation entityInformation) {
        super(entityClass, entityManager);
        this.entityManager = entityManager;
        this.repositoryInformation = entityInformation;
        this.entityClass = entityClass;
    }
    public List findByIds(ID ... ids){
        List list = new ArrayList<>();
        for (ID id : ids) {
            list.add(id);
        }
        return findAllById(list);
    }
    //
    @Transactional
    public T getByWhere(  String where, Object ...params){
        return executeGetByWhere(getEntityTableName(),  where, params);
    }
    @Transactional
    public List findByWhere(String where, Object ...params) {
        return executeFindByWhere(getEntityTableName(),  where, params);
    }
    @Transactional
    public Map getMapByWhere(String select, String where, Object ...params){
        return executeGetMapByWhere(getEntityTableName(), select, where, params);
    }
    @Transactional
    public List findMapByWhere(String select, String where, Object ...params) {
        return executeFindMapByWhere(getEntityTableName(), select, where, params);
    }
    @Transactional
    public  List findColumnListByWhere(Class columnClass, String column, String where, Object ...params) {
        return executeFindColumnListByWhere(columnClass,getEntityTableName(), column, where, params);
    }
    @Transactional
    public Object getResponseValueByWhere(String select, String where, Object ...params){
        return executeGetResponseValueByWhere(getEntityTableName(), select, where, params);
    }

    @Transactional
    public Page findPageByWhere(Pageable pageable, String where, Object ...params) {
        return executeFindPageByWhere( getEntityTableName(),pageable, where, params);
    }
    @Transactional
    public Page findPageMapByWhere(Pageable pageable, String select, String where, Object ...params) {
        return executeFindPageMapByWhere(getEntityTableName(),pageable, select, where, params);
    }
    @Transactional
    public int delectByWhere(String where, Object ...params) {
        return executeDelectByWhere(getEntityTableName(),  where, params);
    }
    @Transactional
    public int updateByWhere(String updateSql, String where, Object ...params) {
        return executeUpdateByWhere(getEntityTableName(),updateSql,  where, params);
    }
    @Transactional
    public int insertSql(String fieldsSql, String valueSql, Object ...params) {
        return executeInsertSql(getEntityTableName(), fieldsSql, valueSql, params);
    }

    @Transactional
    public int dropTable(Class... entityClass) {
        int index=0;
        for (Class aClass : entityClass) {
            index+=executeDropTableSql(getTableName(aClass));
        }
        return index;
    }
    @Transactional
    public int truncateTable(Class... entityClass) {
        int index=0;
        for (Class aClass : entityClass) {
            index+=executeDropTableSql(getTableName(aClass));
        }
        return index;
    }

    @Override
    public T insert(T entity) {
        if(outLog("")) return entity;
        this.entityManager.persist(entity);
        return entity;
    }

    @Override
    public T update(T entity) {
        if(outLog("")) return entity;
        return this.entityManager.merge(entity);
    }

    //
    //
    @Transactional
    public T executeGetByWhere(String tablename, String where, Object ...params){
        List list = executeFindByWhere(tablename, where, params);
        if(list==null || list.size()==0){
            return null;
        }
        return list.get(0);
    }
    @Transactional
    public List executeFindByWhere(String tablename, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildQuerySql(tablename,"*",  where, params);
        String sqlText = sqlItem.getSqlText();

        Query query = entityManager.createNativeQuery(sqlText,getEntityClass());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        List list = query.getResultList();
        return list;
    }
    @Transactional
    public Map executeGetMapByWhere(String tablename, String select, String where, Object ...params){
        List list = executeFindMapByWhere(tablename, select, where, params);
        if(list==null || list.size()==0){
            return null;
        }
        return list.get(0);
    }
    @Transactional
    public List executeFindMapByWhere(String tablename, String select, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildQuerySql(tablename,select,  where, params);
        String sqlText = sqlItem.getSqlText();

        Query query = entityManager.createNativeQuery(sqlText);
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
//        query.getResultList()
        query.unwrap(NativeQueryImpl.class)
                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List list = (List) query.getResultList();
        return list;
    }
    @Transactional
    public  List executeFindColumnListByWhere(Class columnClass, String tablename, String column, String where, Object ...params) {
        List maps = executeFindMapByWhere(tablename, column, where, params);
        List items =new ArrayList<>();
        for (Map map : maps) {
            items.add((S)map.get(column));
        }
        return items;
    }
    @Transactional
    public Page executeFindPageByWhere(String tablename,Pageable pageable, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildQuerySql(tablename,"count(*)",  where, params);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        long count = ((BigInteger) query.getSingleResult()).longValue();
        int begin=(pageable.getPageNumber())*pageable.getPageSize();
        int size=pageable.getPageSize();
        where = where+" limit " +begin +","+size;
        List list = executeFindByWhere(tablename, where, params);
        PageImpl page=new PageImpl(list,pageable,count);
        return page;
    }
    @Transactional
    public Page executeFindPageMapByWhere(String tablename,Pageable pageable, String select, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildQuerySql(tablename,"count(*)",  where, params);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        long count = ((BigInteger) query.getSingleResult()).longValue();
        int begin=(pageable.getPageNumber())*pageable.getPageSize();
        int size=pageable.getPageSize();
        where = where+" limit " +begin +","+size;
        List list = executeFindMapByWhere(tablename, select, where, params);
        PageImpl page=new PageImpl(list,pageable,count);
        return page;
    }
    @Transactional
    public Object executeGetResponseValueByWhere(String tablename,String select, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildQuerySql(tablename,select,  where, params);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        return query.getSingleResult();
    }

    @Transactional
    public int executeDelectByWhere(String tablename, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildDeleteSql(tablename,  where, params);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        return query.executeUpdate();
    }
    @Transactional
    public int executeUpdateByWhere(String tablename,String updateSql, String where, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildUpdateSql(tablename, updateSql, where, params);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        return query.executeUpdate();
    }
    @Transactional
    public int executeInsertSql(String tablename,String fieldsSql, String valueSql, Object ...params) {
        SqlItem sqlItem = SqlBuilder.buildInsertSql(tablename, fieldsSql, valueSql, params);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        int index=1;
        for (Object param:params){
            query.setParameter(index,param);
            index++;
        }
        return query.executeUpdate();
    }
    @Transactional
    public int executeDropTableSql(String tablename) {
        SqlItem sqlItem = SqlBuilder.buildDropTableSql(tablename);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        return query.executeUpdate();
    }
    @Transactional
    public int executeTruncateTableSql(String tablename) {
        SqlItem sqlItem = SqlBuilder.buildTruncateTableSql(tablename);
        Query query = entityManager.createNativeQuery(sqlItem.getSqlText());
        return query.executeUpdate();
    }

    String replacePlaceholder(String content,String regex,int beginIndex,String replaceRegex){
        int pos = content.indexOf(regex);
        if(pos<=0){
            return content;
        }
        int pre=0;
        StringBuilder sql = new StringBuilder();
        while (pos>=0){
            sql.append(content.substring(pre,pos-pre));
            sql.append(replaceRegex+""+beginIndex);
            content=content.substring(pos+regex.length());
            pos = content.indexOf(regex);
        }
        if(content.length()>0){
            sql.append(content);
        }
        return sql.toString();
    }
    String replacePlaceholder(String content,int beginIndex){
        return replacePlaceholder(content,"?",beginIndex,"?");
    }
    //

    public List findByName(String name) {
        Class entityClass = getEntityClass();
        return findByWhere("*","name=?",name);
    }
    @Override
    public Class getEntityClass() {
        return entityClass;
    }

    protected String getEntityTableName(){
        return getTableName(getEntityClass()).toLowerCase();
    }
    protected String getTableName(Class entityClass) {
        Annotation entityAnnotation = entityClass.getAnnotation(Entity.class);
        if(entityAnnotation==null){
            new IllegalAccessError(entityClass+" not entity object.");
        }
        String name=entityClass.getSimpleName();
        Annotation tableAnnotation = entityClass.getAnnotation(Table.class);
        if(tableAnnotation!=null){
            Table table=(Table) tableAnnotation;
            if(table.appliesTo()!=null && table.appliesTo().length()>0){
                name=table.appliesTo();
            }
        }
        return name;
    }

    boolean outLog(String message){
//        System.out.println(message);
//        return getKskksk();
        return false;
    }

}