运行无报错,序列化ID无法解决,需要使用@Query手动写SQL解决,现在这个问题只产生在中间关联表上,正常实体类不会
This commit is contained in:
parent
94aeb16a61
commit
6d9ce4e2fd
@ -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, '财务部',
|
true, false, 3, '财务部',
|
||||||
'admin', '2024-02-01 09:00:00', 'admin', '2024-03-01 15:00:00', 5);
|
'admin', '2024-02-01 09:00:00', 'admin', '2024-03-01 15:00:00', 5);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -30,11 +30,9 @@ import org.springframework.util.StringUtils;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.StreamSupport;
|
|
||||||
|
|
||||||
@Transactional
|
@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;
|
protected final IBaseRepository<T, ID> repository;
|
||||||
|
|
||||||
@ -286,12 +284,10 @@ public abstract class BaseServiceImpl<T extends Entity<ID>, ID extends Serializa
|
|||||||
@Override
|
@Override
|
||||||
public List<T> findAll(BaseQuery query) {
|
public List<T> findAll(BaseQuery query) {
|
||||||
BooleanBuilder builder = new BooleanBuilder().and(Expressions.asBoolean(true).isTrue());
|
BooleanBuilder builder = new BooleanBuilder().and(Expressions.asBoolean(true).isTrue());
|
||||||
|
|
||||||
// 添加查询条件
|
// 添加查询条件
|
||||||
if (query != null) {
|
if (query != null) {
|
||||||
buildQueryPredicate(query, builder);
|
buildQueryPredicate(query, builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理软删除
|
// 处理软删除
|
||||||
if (query == null || query.getDeleted() == null) {
|
if (query == null || query.getDeleted() == null) {
|
||||||
Class<?>[] genericTypes = GenericTypeResolver.resolveTypeArguments(getClass(), BaseServiceImpl.class);
|
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 sort = query != null && StringUtils.hasText(query.getSortField()) ?
|
||||||
Sort.by(Sort.Direction.fromString(query.getSortOrder()), query.getSortField()) :
|
Sort.by(Sort.Direction.fromString(query.getSortOrder()), query.getSortField()) :
|
||||||
Sort.by(Sort.Direction.DESC, "createTime");
|
Sort.by(Sort.Direction.DESC, "createTime");
|
||||||
|
|
||||||
// 执行查询并返回结果
|
// 执行查询并返回结果
|
||||||
Iterable<T> iterable = repository.findAll(builder, sort);
|
Iterable<T> iterable = repository.findAll(builder, sort);
|
||||||
List<T> result = new ArrayList<>();
|
List<T> result = new ArrayList<>();
|
||||||
|
|||||||
@ -1,13 +1,24 @@
|
|||||||
package com.qqchen.deploy.backend.entity;
|
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.annotation.LogicDelete;
|
||||||
import com.qqchen.deploy.backend.common.domain.Entity;
|
import com.qqchen.deploy.backend.common.domain.Entity;
|
||||||
import jakarta.persistence.Column;
|
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.Table;
|
||||||
|
import jakarta.persistence.Transient;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -42,5 +53,17 @@ public class Menu extends Entity<Long> {
|
|||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
private Boolean enabled = true;
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -5,6 +5,7 @@ import com.qqchen.deploy.backend.common.annotation.LogicDelete;
|
|||||||
import com.qqchen.deploy.backend.common.domain.Entity;
|
import com.qqchen.deploy.backend.common.domain.Entity;
|
||||||
import jakarta.persistence.CascadeType;
|
import jakarta.persistence.CascadeType;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.ManyToMany;
|
||||||
import jakarta.persistence.OneToMany;
|
import jakarta.persistence.OneToMany;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
@ -41,4 +42,9 @@ public class Role extends Entity<Long> {
|
|||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@ToString.Exclude
|
@ToString.Exclude
|
||||||
private Set<UserRole> userRoles = new HashSet<>();
|
private Set<UserRole> userRoles = new HashSet<>();
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "role", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||||
|
@JsonIgnore
|
||||||
|
@ToString.Exclude
|
||||||
|
private Set<RoleMenu> roleMenus = new HashSet<>();
|
||||||
}
|
}
|
||||||
@ -1,12 +1,19 @@
|
|||||||
package com.qqchen.deploy.backend.entity;
|
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.annotation.LogicDelete;
|
||||||
import com.qqchen.deploy.backend.common.domain.Entity;
|
import com.qqchen.deploy.backend.common.domain.Entity;
|
||||||
import jakarta.persistence.Column;
|
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 jakarta.persistence.Table;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -16,9 +23,22 @@ import lombok.EqualsAndHashCode;
|
|||||||
@LogicDelete
|
@LogicDelete
|
||||||
public class RoleMenu extends Entity<Long> {
|
public class RoleMenu extends Entity<Long> {
|
||||||
|
|
||||||
@Column(name = "role_id", nullable = false)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Long roleId;
|
@JoinColumn(name = "role_id")
|
||||||
|
@JsonIgnore
|
||||||
|
@ToString.Exclude
|
||||||
|
private Role role;
|
||||||
|
|
||||||
@Column(name = "menu_id", nullable = false)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Long menuId;
|
@JoinColumn(name = "menu_id")
|
||||||
|
@JsonIgnore
|
||||||
|
@ToString.Exclude
|
||||||
|
private Menu menu;
|
||||||
|
|
||||||
|
protected RoleMenu() {}
|
||||||
|
|
||||||
|
public RoleMenu(Role role, Menu menu) {
|
||||||
|
this.role = role;
|
||||||
|
this.menu = menu;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -3,6 +3,7 @@ package com.qqchen.deploy.backend.repository;
|
|||||||
|
|
||||||
import com.qqchen.deploy.backend.common.repository.IBaseRepository;
|
import com.qqchen.deploy.backend.common.repository.IBaseRepository;
|
||||||
import com.qqchen.deploy.backend.entity.RoleMenu;
|
import com.qqchen.deploy.backend.entity.RoleMenu;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -10,9 +11,10 @@ import java.util.List;
|
|||||||
@Repository
|
@Repository
|
||||||
public interface IRoleMenuRepository extends IBaseRepository<RoleMenu, Long> {
|
public interface IRoleMenuRepository extends IBaseRepository<RoleMenu, Long> {
|
||||||
|
|
||||||
List<RoleMenu> findByRoleId(Long roleId);
|
// List<RoleMenu> findByRoleId(Long roleId);
|
||||||
|
//
|
||||||
void deleteByRoleId(Long roleId);
|
// void deleteByRoleId(Long roleId);
|
||||||
|
//
|
||||||
List<RoleMenu> findByRoleIdIn(List<Long> roleIds);
|
// List<RoleMenu> findByRoleIdIn(List<Long> roleIds);
|
||||||
|
// 通过角色ID查询
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user