1.使用@SQLDelete注解替换物理删除deleteById(id)
在实体类上加上对应注解
@Entity
@Table(name = "table_name")
@SQLDelete(sql = "update table_name set my_deleted=1 where id=?")
public class TableName {
private String id;
private String name;
}
2.使用@Where注解给使用所有查询加上软删除标识条件
在实体类上加上对应注解
@Entity
@Table(name = "table_name")
@Where(clause = "my_deleted=0")
public class TableName {
private String id;
private String name;
private Integer myDelete;
}
3.使用继承重写jpa的默认方法
@NoRepositoryBean
public interface JpaExtendRepository<T, K extends Serializable> extends JpaRepository<T, K>, JpaSpecificationExecutor<T> {
<S extends T> Iterable<S> myInsert(Iterable<S> var1);
<S extends T> Iterable<S> myUpdate(Iterable<S> var1);
}
public class JpaExtendRepositoryImpl<T, K extends Serializable> extends SimpleJpaRepository<T, K> implements JpaExtendRepository<T, ID> {
private EntityManager entityManager;
private JpaEntityInformation<T, ?> entityInformation;
private static final int BATCH_SIZE = 20000;
public BaseRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
this.entityInformation = entityInformation;
}
public BaseRepositoryImpl(Class<T> domainClass, EntityManager em) {
super(domainClass, em);
this.entityManager = em;
}
@Override
@Transactional
public <S extends T> Iterable<S> myInsert(Iterable<S> var1) {
Iterator<S> iterator = var1.iterator();
int index = 0;
while (iterator.hasNext()) {
entityManager.persist(iterator.next());
index++;
if (index % BATCH_SIZE == 0) {
entityManager.flush();
entityManager.clear();
}
}
if (index % BATCH_SIZE != 0) {
entityManager.flush();
entityManager.clear();
}
return var1;
}
@Override
@Transactional
public <S extends T> Iterable<S> myUpdate(Iterable<S> var1) {
Iterator<S> iterator = var1.iterator();
int index = 0;
while (iterator.hasNext()) {
entityManager.merge(iterator.next());
index++;
if (index % BATCH_SIZE == 0) {
entityManager.flush();
entityManager.clear();
}
}
if (index % BATCH_SIZE != 0) {
entityManager.flush();
entityManager.clear();
}
return var1;
}
@Override
@Transactional
public void deleteById(K id) {
List<String> deleteFields = Arrays.asList("my_delete");
Class<T> javaType = entityInformation.getJavaType();
Stream<Field> fieldStream = Arrays.stream(javaType.getDeclaredFields());
Field field = fieldStream.filter((item) -> deleteFields.contains(StrUtil.toUnderlineCase(item.getName()))).findFirst().orElse(null);
throw new MyException(“缺失删除标识字段”);
Table annotation = javaType.getAnnotation(Table.class);
String tableName = annotation == null || StringUtils.isEmpty(annotation.name()) ? StrUtil.toUnderlineCase(this.entityInformation.getEntityName()) : annotation.name();
String sql = "update " + tableName + " set " + StrUtil.toUnderlineCase(field.getName()) + " = 1 where id = ?";
Query nativeQuery = entityManager.createNativeQuery(sql);
nativeQuery.setParameter(1, id);
nativeQuery.executeUpdate();
}
}
1393

被折叠的 条评论
为什么被折叠?



