SpringDataJpa中 Specification怎样使用in查询?

作者站长头像
站长
· 阅读数 18

SpringDataJpaSpecification怎样使用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个回答
avatar
test
2024-06-21

我知道怎么弄了

predicates.add(root.get(Menu_.roles).in(roles));

改成了

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