可正常启动

This commit is contained in:
dengqichen 2024-11-29 12:39:21 +08:00
parent 130ff8b592
commit 00de9c57cb
9 changed files with 46 additions and 133 deletions

View File

@ -4,9 +4,8 @@ import com.qqchen.deploy.backend.dto.RoleDTO;
import com.qqchen.deploy.backend.entity.Role;
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
@Mapper(config = BaseConverter.class)
public interface RoleConverter extends BaseConverter<Role, RoleDTO> {
// MapStruct 会自动实现必要的方法
// MapStruct 会自动实现所有方法
}

View File

@ -2,10 +2,11 @@ package com.qqchen.deploy.backend.converter;
import com.qqchen.deploy.backend.dto.TenantDTO;
import com.qqchen.deploy.backend.entity.Tenant;
import com.qqchen.deploy.backend.framework.converter.AbstractConverter;
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
import org.mapstruct.Mapper;
@Mapper(config = BaseConverter.class)
public abstract class TenantConverter extends AbstractConverter<Tenant, TenantDTO> implements BaseConverter<Tenant, TenantDTO> {
public interface TenantConverter extends BaseConverter<Tenant, TenantDTO> {
// MapStruct 会自动实现所有方法
}

View File

@ -1,11 +1,11 @@
package com.qqchen.deploy.backend.converter;
import com.qqchen.deploy.backend.framework.converter.AbstractConverter;
import com.qqchen.deploy.backend.framework.converter.BaseConverter;
import com.qqchen.deploy.backend.entity.User;
import com.qqchen.deploy.backend.dto.UserDTO;
import org.mapstruct.Mapper;
@Mapper(config = BaseConverter.class)
public abstract class UserConverter extends AbstractConverter<User, UserDTO> implements BaseConverter<User, UserDTO> {
public interface UserConverter extends BaseConverter<User, UserDTO> {
// MapStruct 会自动实现所有方法
}

View File

@ -11,5 +11,6 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryField {
String field() default ""; // 实体类中的字段名
QueryType type() default QueryType.EQUAL; // 查询方式
}

View File

@ -1,29 +0,0 @@
package com.qqchen.deploy.backend.framework.converter;
import com.qqchen.deploy.backend.framework.domain.Entity;
import com.qqchen.deploy.backend.framework.dto.BaseDTO;
import org.springframework.core.GenericTypeResolver;
public abstract class AbstractConverter<T extends Entity<?>, D extends BaseDTO> {
private final Class<T> entityClass;
private final Class<D> dtoClass;
@SuppressWarnings("unchecked")
protected AbstractConverter() {
Class<?>[] genericTypes = GenericTypeResolver.resolveTypeArguments(getClass(), AbstractConverter.class);
if (genericTypes == null || genericTypes.length < 2) {
throw new IllegalStateException("Could not resolve generic types");
}
this.entityClass = (Class<T>) genericTypes[0];
this.dtoClass = (Class<D>) genericTypes[1];
}
public Class<T> getEntityClass() {
return entityClass;
}
public Class<D> getDtoClass() {
return dtoClass;
}
}

View File

@ -59,5 +59,4 @@ public interface BaseConverter<T extends Entity<?>, D extends BaseDTO> {
.map(this::toEntity)
.collect(Collectors.toList());
}
}

View File

@ -1,5 +1,6 @@
package com.qqchen.deploy.backend.framework.repository;
import com.google.common.collect.Lists;
import com.qqchen.deploy.backend.framework.domain.Entity;
import jakarta.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;
@ -17,14 +18,12 @@ import java.util.List;
import java.util.Optional;
import java.util.Collection;
import java.time.LocalDateTime;
import java.util.ArrayList;
@NoRepositoryBean
public interface IBaseRepository<T extends Entity<ID>, ID extends Serializable>
extends JpaRepository<T, ID>, QuerydslPredicateExecutor<T> {
// extends JpaRepository<T, ID>, QuerydslPredicateExecutor<T>, JpaSpecificationExecutor<T> {
// 基础查询方法
@Override
@Query("select e from #{#entityName} e where e.deleted = false")
List<T> findAll();
@ -33,6 +32,7 @@ public interface IBaseRepository<T extends Entity<ID>, ID extends Serializable>
@Query("select e from #{#entityName} e where e.id = ?1 and e.deleted = false")
Optional<T> findById(ID id);
// 逻辑删除
@Override
default void delete(T entity) {
entity.setDeleted(true);
@ -46,12 +46,18 @@ public interface IBaseRepository<T extends Entity<ID>, ID extends Serializable>
// 批量操作
@Modifying
@Query("update #{#entityName} e set e.deleted = true where e.id in ?1")
void logicDeleteByIds(Collection<ID> ids);
@Query("update #{#entityName} e set e.deleted = true where e.id in :ids")
void batchDelete(@Param("ids") Collection<ID> ids);
// @Modifying
// @Query("update #{#entityName} e set e.enabled = ?2 where e.id in ?1")
// void updateEnabledByIds(Collection<ID> ids, boolean enabled);
@Modifying
@Query("UPDATE #{#entityName} e SET e.updateTime = :updateTime, " +
"e.updateBy = :updateBy, e.version = e.version + 1 " +
"WHERE e.id IN :ids")
void batchUpdate(
@Param("ids") Collection<ID> ids,
@Param("updateTime") LocalDateTime updateTime,
@Param("updateBy") String updateBy
);
// 快速查询方法
Optional<T> findByIdAndDeletedFalse(ID id);
@ -60,109 +66,41 @@ public interface IBaseRepository<T extends Entity<ID>, ID extends Serializable>
boolean existsByIdAndDeletedFalse(ID id);
// 自定义查询
// 条件查询
@Query("select e from #{#entityName} e where e.deleted = false and " +
"(?1 is null or e.createTime >= ?1) and " +
"(?2 is null or e.createTime <= ?2)")
List<T> findByCreateTimeBetween(LocalDateTime start, LocalDateTime end);
"(:start is null or e.createTime >= :start) and " +
"(:end is null or e.createTime <= :end)")
List<T> findByCreateTimeBetween(
@Param("start") LocalDateTime start,
@Param("end") LocalDateTime end
);
@Query("select e from #{#entityName} e where e.deleted = false and " +
"(?1 is null or e.createBy = ?1)")
List<T> findByCreateBy(String creator);
"(:creator is null or e.createBy = :creator)")
List<T> findByCreateBy(@Param("creator") String creator);
@Query("select e from #{#entityName} e where e.deleted = false " +
"order by e.createTime desc")
List<T> findLatest(Pageable pageable);
// 统计方法
@Query("select count(e) from #{#entityName} e where e.deleted = false")
long countNonDeleted();
// @Query("select count(e) from #{#entityName} e where e.deleted = false and e.enabled = ?1")
// long countByEnabled(boolean enabled);
// 高级查询
@Query("select e from #{#entityName} e where e.deleted = false " +
"order by e.createTime desc")
List<T> findLatest(Pageable pageable);
@Query("select distinct e.createBy from #{#entityName} e where e.deleted = false")
List<String> findAllCreators();
// 批量更新
@Modifying
@Query("update #{#entityName} e set e.updateBy = ?2, e.updateTime = ?3 where e.id in ?1")
void updateAuditInfo(Collection<ID> ids, String updateBy, LocalDateTime updateTime);
/**
* 根据条件查询并排序
*/
// QueryDSL支持
default List<T> findAllByCondition(com.querydsl.core.types.Predicate predicate, Sort sort) {
Iterable<T> iterable = findAll(predicate, sort);
List<T> result = new ArrayList<>();
iterable.forEach(result::add);
return result;
return Lists.newArrayList(findAll(predicate, sort));
}
// 批量保存并返回保存的实体
default List<T> saveAllAndReturn(Iterable<T> entities) {
return saveAll(entities);
}
/**
* 根据条件查询并排序
* 使用QueryDSL的Predicate进行条件查询
*/
@Override
Iterable<T> findAll(com.querydsl.core.types.Predicate predicate);
@Override
Iterable<T> findAll(com.querydsl.core.types.Predicate predicate, Sort sort);
/**
* 提供一个默认的转换方法
*/
default List<T> findAllAndConvert(com.querydsl.core.types.Predicate predicate, Sort sort) {
Iterable<T> iterable = findAll(predicate, sort);
List<T> result = new ArrayList<>();
iterable.forEach(result::add);
return result;
}
// 批量插入优化
@Modifying
@Query(value = "INSERT INTO #{#entityName} (id, create_time, create_by) VALUES (:id, :createTime, :createBy)",
nativeQuery = true)
void batchInsert(
@Param("id") ID id,
@Param("createTime") LocalDateTime createTime,
@Param("createBy") String createBy
);
// 批量更新优化
@Modifying
@Query("UPDATE #{#entityName} e SET e.updateTime = :updateTime, e.updateBy = :updateBy WHERE e.id IN :ids")
void batchUpdate(
@Param("ids") Collection<ID> ids,
@Param("updateTime") LocalDateTime updateTime,
@Param("updateBy") String updateBy
);
// 批量逻辑删除优化
@Modifying
@Query("UPDATE #{#entityName} e SET e.deleted = true, e.updateTime = :updateTime, e.updateBy = :updateBy WHERE e.id IN :ids")
void batchLogicDelete(
@Param("ids") Collection<ID> ids,
@Param("updateTime") LocalDateTime updateTime,
@Param("updateBy") String updateBy
);
// 添加悲观锁查询
// 乐观锁支持
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT e FROM #{#entityName} e WHERE e.id = :id AND e.deleted = false")
Optional<T> findByIdWithLock(@Param("id") ID id);
// 批量更新时添加版本控制
@Modifying
@Query("UPDATE #{#entityName} e SET e.updateTime = :updateTime, " +
"e.updateBy = :updateBy, e.version = e.version + 1 " +
"WHERE e.id IN :ids AND e.version = :version")
"e.updateBy = :updateBy, e.version = e.version + 1 " +
"WHERE e.id IN :ids AND e.version = :version")
int batchUpdateWithVersion(
@Param("ids") Collection<ID> ids,
@Param("updateTime") LocalDateTime updateTime,

View File

@ -23,7 +23,9 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
public class SecurityConfig {
private final CustomAuthenticationEntryPoint authenticationEntryPoint;
private final UserDetailsService userDetailsService;
private final JwtTokenUtil jwtTokenUtil;
@Bean

View File

@ -13,7 +13,7 @@ spring:
show-sql: true
properties:
hibernate:
format_sql: false
format_sql: true
use_sql_comments: true
dialect: org.hibernate.dialect.MySQL8Dialect
jdbc:
@ -36,8 +36,10 @@ logging:
org.springframework.web: DEBUG
org.springframework.context.i18n: DEBUG
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.SQL: DEBUG
org.hibernate.type.descriptor.sql: TRACE
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.orm.jdbc.bind: TRACE
com.qqchen.deploy.backend.framework.utils.EntityPathResolver: DEBUG
com.qqchen.deploy.backend: DEBUG
jwt: