运行无报错,序列化ID无法解决,需要使用@Query手动写SQL解决,现在这个问题只产生在中间关联表上,正常实体类不会

This commit is contained in:
dengqichen 2024-11-27 15:54:59 +08:00
parent 94aeb16a61
commit 6d9ce4e2fd
6 changed files with 76 additions and 22 deletions

View File

@ -1,3 +1,11 @@
# 问题解决方案
##### 1、Cannot compare left expression of type 'java.io.Serializable' with right expression of type 'java.lang.Long'
```
使用@Query查询因为无法解决序列化问题
```
`
分层结构从上到下:
`
@ -125,3 +133,4 @@ true, false, 2, '市场部',
true, false, 3, '财务部',
'admin', '2024-02-01 09:00:00', 'admin', '2024-03-01 15:00:00', 5);
```

View File

@ -30,11 +30,9 @@ import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@Transactional
public abstract class BaseServiceImpl<T extends Entity<ID>, ID extends Serializable> implements IBaseService<T, ID> {
public abstract class BaseServiceImpl<T extends Entity<ID>, ID extends Number & Serializable> implements IBaseService<T, ID> {
protected final IBaseRepository<T, ID> repository;
@ -286,12 +284,10 @@ public abstract class BaseServiceImpl<T extends Entity<ID>, ID extends Serializa
@Override
public List<T> findAll(BaseQuery query) {
BooleanBuilder builder = new BooleanBuilder().and(Expressions.asBoolean(true).isTrue());
// 添加查询条件
if (query != null) {
buildQueryPredicate(query, builder);
}
// 处理软删除
if (query == null || query.getDeleted() == null) {
Class<?>[] genericTypes = GenericTypeResolver.resolveTypeArguments(getClass(), BaseServiceImpl.class);
@ -306,12 +302,10 @@ public abstract class BaseServiceImpl<T extends Entity<ID>, ID extends Serializa
}
}
}
// 获取排序信息
Sort sort = query != null && StringUtils.hasText(query.getSortField()) ?
Sort.by(Sort.Direction.fromString(query.getSortOrder()), query.getSortField()) :
Sort.by(Sort.Direction.DESC, "createTime");
// 执行查询并返回结果
Iterable<T> iterable = repository.findAll(builder, sort);
List<T> result = new ArrayList<>();

View File

@ -1,13 +1,24 @@
package com.qqchen.deploy.backend.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.qqchen.deploy.backend.common.annotation.LogicDelete;
import com.qqchen.deploy.backend.common.domain.Entity;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Data
@ -42,5 +53,17 @@ public class Menu extends Entity<Long> {
@Column(nullable = false)
private Boolean enabled = true;
// List<RoleMenu> roleMenu;
// 通过RoleMenu关联到Role
@OneToMany(mappedBy = "menu")
@JsonIgnore
@ToString.Exclude
private Set<RoleMenu> roleMenus = new HashSet<>();
// 便捷方法获取所有关联的角色
@Transient
public Set<Role> getRoles() {
return roleMenus.stream()
.map(RoleMenu::getRole)
.collect(Collectors.toSet());
}
}

View File

@ -5,6 +5,7 @@ import com.qqchen.deploy.backend.common.annotation.LogicDelete;
import com.qqchen.deploy.backend.common.domain.Entity;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotBlank;
@ -41,4 +42,9 @@ public class Role extends Entity<Long> {
@JsonIgnore
@ToString.Exclude
private Set<UserRole> userRoles = new HashSet<>();
@OneToMany(mappedBy = "role", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnore
@ToString.Exclude
private Set<RoleMenu> roleMenus = new HashSet<>();
}

View File

@ -1,12 +1,19 @@
package com.qqchen.deploy.backend.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.qqchen.deploy.backend.common.annotation.LogicDelete;
import com.qqchen.deploy.backend.common.domain.Entity;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Set;
@Data
@ -16,9 +23,22 @@ import lombok.EqualsAndHashCode;
@LogicDelete
public class RoleMenu extends Entity<Long> {
@Column(name = "role_id", nullable = false)
private Long roleId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
@JsonIgnore
@ToString.Exclude
private Role role;
@Column(name = "menu_id", nullable = false)
private Long menuId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "menu_id")
@JsonIgnore
@ToString.Exclude
private Menu menu;
protected RoleMenu() {}
public RoleMenu(Role role, Menu menu) {
this.role = role;
this.menu = menu;
}
}

View File

@ -3,6 +3,7 @@ package com.qqchen.deploy.backend.repository;
import com.qqchen.deploy.backend.common.repository.IBaseRepository;
import com.qqchen.deploy.backend.entity.RoleMenu;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@ -10,9 +11,10 @@ import java.util.List;
@Repository
public interface IRoleMenuRepository extends IBaseRepository<RoleMenu, Long> {
List<RoleMenu> findByRoleId(Long roleId);
void deleteByRoleId(Long roleId);
List<RoleMenu> findByRoleIdIn(List<Long> roleIds);
// List<RoleMenu> findByRoleId(Long roleId);
//
// void deleteByRoleId(Long roleId);
//
// List<RoleMenu> findByRoleIdIn(List<Long> roleIds);
// 通过角色ID查询
}