SpringDataJpa中 Specification怎样使用in查询?
SpringDataJpa
中 Specification
怎样使用in
查询
实体类Menu.java
如下
@Entity
@Getter
@Table(name = "t_sys_menu")
@org.hibernate.annotations.DynamicInsert
@org.hibernate.annotations.DynamicUpdate
@org.hibernate.annotations.Where(clause = SysConstants.WHERE_DELETE)
public class Menu extends TreeEntity<Menu, Long> {
@Column(nullable = false, length = 50)
private String name;
@Column(length = 100)
private String path;
@Column(length = 100)
private String componentPath;
@Column(columnDefinition = "int unsigned")
private Integer level;
/**
* 0表示目录,1表示菜单,2表示按钮
*/
@Column(nullable = false, columnDefinition = "tinyint unsigned")
private Integer type;
@Column(length = 20)
private String icon;
@JoinColumn
@ManyToOne(fetch = FetchType.LAZY)
private Application application;
@Column(nullable = true, length = 50)
private String permission;
@Convert(converter = Status.Converter.class)
@Column(nullable = false, columnDefinition = "tinyint unsigned")
private Status status;
private String visible;
/**
* 打开方式 页签 或是 新窗口
*/
private String target;
@Column(columnDefinition = "int unsigned")
private Integer sort;
@Column(length = 200)
public String description;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "t_sys_role_menu", joinColumns = @JoinColumn(name = "menu_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Collection<Role> roles;
想通过roles
属性做in查询,代码如下
private Specification<Menu> buildSearchSpecification(MenuDTO menuDTO) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.hasText(menuDTO.getRoleIds())) {
List<Role> roles = new ArrayList<>();
for (Long roleId : Convert.toList(Long.class, menuDTO.getRoleIds())) {
roles.add(new Role(roleId));
}
predicates.add(root.get(Menu_.roles).in(roles));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
错误如下:
Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)]
我的Specification
方式的in
查询写的哪里不对,如何修改正确?
回复
1个回答

test
2024-06-21
我知道怎么弄了
predicates.add(root.get(Menu_.roles).in(roles));
改成了
predicates.add(root.join(Menu_.roles, JoinType.LEFT).in(roles));
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容