package com.dounine.corgi.jpa.service;
import com.dounine.corgi.jpa.constant.FinalCommons;
import com.dounine.corgi.jpa.dao.MyRep;
import com.dounine.corgi.jpa.dao.MySpecification;
import com.dounine.corgi.jpa.dto.BaseDto;
import com.dounine.corgi.jpa.entity.BaseEntity;
import com.dounine.corgi.jpa.exception.RepException;
import com.dounine.corgi.jpa.exception.SerException;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Stream;
/**
* Created by huanghuanlai on 16/9/3.
*/
public class ServiceImpl<BE extends BaseEntity, BD extends BaseDto> extends FinalCommons implements IService<BE, BD> {
private static final Logger CONSOLE = LoggerFactory.getLogger(ServiceImpl.class);
@Autowired
protected MyRep<BE, BD> myRepository;
@Override
public List<BE> findAll() throws SerException {
return myRepository.findAll();
}
@Override
public List<BE> findByPage(BD dto) throws SerException {
try {
MySpecification mySpecification = new MySpecification<BE, BD>(dto);
PageRequest pageRequest = mySpecification.getPageRequest(dto);
return myRepository.findAll(mySpecification, pageRequest).getContent();
} catch (RepException e) {
throw repExceptionHandler(e);
}
}
@Override
public Long count(BD dto) throws SerException {
MySpecification mySpecification = new MySpecification<BE, BD>(dto);
return myRepository.count(mySpecification);
}
@Override
public BE findOne(BD dto) throws SerException {
MySpecification mySpecification = new MySpecification<BE, BD>(dto);
List<BE> list = myRepository.findAll(mySpecification);
return null != list && list.size() > 0 ? list.get(0) : null;
}
@Override
public List<BE> findByCis(BD dto, Boolean pageAndSort) throws SerException {
MySpecification mySpecification = new MySpecification<BE, BD>(dto);
if (pageAndSort) {
PageRequest pageRequest = mySpecification.getPageRequest(dto);
return myRepository.findAll(mySpecification, pageRequest).getContent();
} else {
return myRepository.findAll(mySpecification);
}
}
@Override
public List<BE> findByCis(BD dto) throws SerException {
MySpecification mySpecification = new MySpecification<BE, BD>(dto);
return myRepository.findAll(mySpecification);
}
@Override
public Long countByCis(BD dto) throws SerException {
MySpecification mySpecification = new MySpecification<BE, BD>(dto);
return myRepository.count(mySpecification);
}
@Override
public BE findById(String id) throws SerException {
return myRepository.findById(id);
}
@Override
public BE save(BE entity) throws SerException {
return myRepository.save(entity);
}
@Override
public void save(List<BE> entities) throws SerException {
myRepository.save(entities);
}
@Override
public void remove(String id) throws SerException {
myRepository.delete(id);
}
@Override
public void remove(BE entity) throws SerException {
myRepository.delete(entity);
}
@Override
public void remove(List<BE> entities) {
myRepository.deleteInBatch(entities);
}
@Override
public void update(BE entity) throws SerException {
myRepository.saveAndFlush(entity);
}
@Override
public void update(List<BE> entities) throws SerException {
Stream<BE> stream = entities.stream();
stream.forEach(entity -> {
myRepository.saveAndFlush(entity);
});
}
@Override
public boolean exists(String id) throws SerException {
return myRepository.exists(id);
}
private SerException repExceptionHandler(RepException e) {
String msg = "";
switch (e.getType()) {
case NOT_FIND_FIELD:
msg = "非法查询";
break;
case ERROR_ARGUMENTS:
msg = "参数不匹配";
break;
case ERROR_PARSE_DATE:
msg = "时间类型转换错误,字段类型不匹配";
break;
case ERROR_NUMBER_FORMAT:
msg = "整形转换错误,字段类型不匹配";
break;
default:
msg = e.getMessage();
}
return new SerException(msg);
}
}