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 { @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 roles; 想通过`roles`属性做in查询,代码如下 private Specification buildSearchSpecification(MenuDTO menuDTO) { return (root, query, criteriaBuilder) -> { List predicates = new ArrayList(); if (StringUtils.hasText(menuDTO.getRoleIds())) { List 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`查询写的哪里不对,如何修改正确?

阅读量:151

点赞量:0

问AI
我知道怎么弄了 predicates.add(root.get(Menu_.roles).in(roles)); 改成了 predicates.add(root.join(Menu_.roles, JoinType.LEFT).in(roles));