/**
 * Copyright 2008-2009. Chongqing Communications Industry Services Co.,Ltd Information Technology Branch. All rights reserved. <a>http://www.crunii.com</a>
 */
package com.crunii.micro.domain.common;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import com.crunii.micro.common.dto.OrderProp;

/**
 * @author 田平 create 2018年9月17日下午5:33:08
 */

@NoRepositoryBean
public interface BaseRepo<T, ID extends Serializable> extends JpaRepository<T, ID> {

	public T getOne(ID id);
	/**
	 * 把操作对象在缓存区中直接清除，保持方法名和hibernate一样实际调用entityManager.detach(entity);
	 *
	 * @param entity
	 */
	public void evict(T entity);

	/**
	 * 通过属性Map查找 props map中的value的类型必须和实体一致 ,只返回小于等于1条数据，多于一条异常
	 *
	 * @param props
	 * @param os
	 * @return
	 */
	public T getUniqueByProps(Map<String, Object> props);

	/**
	 * 通过属性Map查找 props map中的value的类型自动转换 ,只返回小于等于1条数据，多于一条异常
	 *
	 * @param props
	 * @param os
	 * @return
	 */
	public T getUniqueByStrProps(Map<String, String> props);

	/**
	 * 通过属性返回唯一记录或者0条记录，0条记录时候返回空
	 *
	 * @param prop
	 * @param value
	 * @param os
	 * @return
	 */
	public T getUniqueByProp(String prop, Object value);

	/**
	 * 通过属性Map查找 props map中的value的类型自动转换
	 *
	 * @param props
	 * @param os
	 * @return
	 */
	public List<T> findByStrProps(Map<String, String> props, OrderProp... os);

	/**
	 * 通过属性名查找
	 *
	 * @param property
	 * @param value 类型必须与实体字段类型匹配
	 * @return
	 */
	public List<T> findByProp(String prop, Object value, OrderProp... os);

	/**
	 * 通过属性Map查找
	 *
	 * @param props map中的value的类型必须与实体的自动类型匹配
	 * @param os
	 * @return
	 */
	public List<T> findByProps(Map<String, Object> props, OrderProp... os);

	/**
	 * 通过HQL查询
	 * @param hql
	 * @param objects
	 * @return
	 */
	public List<T> queryByHql(String hql, Map<String, Object> props);

}
