package com.tools.common.dynamicquery;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * 扩展SpringDataJpa, 支持动态jpql/nativesql查询并支持分页查询
 * @author 小柒2012
 */
public interface DynamicQuery {
	/**
	 * 保存
	 * @param entity
	 */
	void save(Object entity);

	/**
	 * 更新
	 * @param entity
	 */
	void update(Object entity);

	/**
	 * 执行nativeSql的update,delete操作
	 * @param nativeSql
	 * @param params
	 * @return
	 */
	int nativeExecuteUpdate(String nativeSql, Object... params);

	/**
	 * 执行nativeSql统计查询
	 * @param nativeSql
	 * @param params 占位符参数(例如?1)绑定的参数值
	 * @return 统计条数
	 */
	Long nativeQueryCount(String nativeSql, Object... params);

	/**
	 * 执行nativeSql查询一行
	 * @param resultClass 查询结果类型
	 * @param nativeSql
	 * @param params 占位符参数(例如?1)绑定的参数值
	 * @return
	 */
	<T> T nativeQuerySingleResult(Class<T> resultClass, String nativeSql, Object... params);

	/**
	 * 执行nativeSql查询 List<Object[]>
	 * @param nativeSql
	 * @param params 占位符参数(例如?1)绑定的参数值
	 * @return
	 */
	<T> List<T> query(String nativeSql, Object... params);

	/**
	 * 执行nativeSql查询
	 * @param resultClass
	 * @param nativeSql
	 * @param params 占位符参数(例如?1)绑定的参数值
	 * @return
	 */
	<T> List<T> query(Class<T> resultClass, String nativeSql, Object... params);

	/**
	 * 执行nativeSql分页查询
	 * @param resultClass 查询结果类型
	 * @param pageable 分页数据
	 * @param nativeSql
	 * @param params 占位符参数(例如?1)绑定的参数值
	 * @return 分页对象
	 */
	<T> Page<T> nativeQuery(Class<T> resultClass, Pageable pageable, String nativeSql, Object... params);

	/**
	 * 执行nativeSql分页查询
	 * @param resultClass
	 * @param pageable
	 * @param nativeSql
	 * @param params
	 * @param List<T>
	 * @return
	 */
	<T> List<T> nativeQueryPagingList(Class<T> resultClass, Pageable pageable, String nativeSql, Object... params);

    /**
     * 查询对象列表，返回List<Map<key,value>>
     * @param nativeSql
     * @param params
     * @return  T
     */
    <T> T nativeQueryMap(String nativeSql, Object... params);

    /**
     * 查询对象列表，返回List<组合对象>
     * @param resultClass
     * @param nativeSql
     * @param params
     * @return
     */
    <T> T nativeQueryModel(Class<T> resultClass, String nativeSql, Object... params);
    /**
     * 查询对象列表，返回List<Map<key,value>>
     * @param nativeSql
     * @param params
     * @return  List<T>
     */
    <T> List<T> nativeQueryListMap(String nativeSql, Object... params);

    /**
     * 查询对象列表，返回List<组合对象>
     * @param resultClass
     * @param nativeSql
     * @param params
     * @return  List<T>
     */
    <T> List<T> nativeQueryListModel(Class<T> resultClass, String nativeSql, Object... params);

    /**
     * 查询对象列表，返回List<组合对象>
     * @param resultClass
     * @param nativeSql
     * @param params
     * @return  List<T>
     */
    <T> List<T> nativeQueryPagingListModel(Class<T> resultClass, Pageable pageable, String nativeSql, Object... params);
}
