在 criteriaBuilder 加入不想正常工作

Posted

技术标签:

【中文标题】在 criteriaBuilder 加入不想正常工作【英文标题】:Join at criteriaBuilder do not want to work correctly 【发布时间】:2019-01-16 13:09:56 【问题描述】:

我正在研究 JPA 规范,它必须对我输入的内容进行选择。 我有实体 Department 字段 code 看起来像 DB001..

    @OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JsonIgnore
    private Set<Employee> departments;

还有员工

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "departmentId")
    @JsonIgnore
    private Department department;

还有我的员工测试控制器

    @GetMapping("/employee")
    public List<Employee> getAllEmployee() 
        final List<SearchData> searchDataList = new ArrayList<>();
        searchDataList.add(new SearchData("name", "Ivan"));
        searchDataList.add(new SearchData("code", "01"));
        return employeeService.getDynamicEmployeeSearch(searchDataList);
    

当我在浏览器中打开它时,它会告诉我

Unable to locate Attribute with the the given name [name] on this ManagedType [com.mentor.jpa.dynamicquery.domain.Department]; nested exception is java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [name] on this ManagedType [com.mentor.jpa.dynamicquery.domain.Department]

我了解,该属性名称仅存在于 Employee 实体中,而不存在于 Department 中,但我需要使用这两个条件进行选择,所以他们需要两者都工作。 (当我尝试一个或多个不需要加入的标准时,它们会起作用!)

我应该在我的 规范 代码中进行哪些更改以使加入工作正常。我在规范

中的代码
@Override
    public Predicate toPredicate(final Root<Employee> root, final CriteriaQuery<?> query,
                                 final CriteriaBuilder criteriaBuilder) 
        if (searchData != null) 
            return criteriaBuilder.like(criteriaBuilder.lower(root
                            .join("department")
                            .get(searchData.getFieldName())
                            .as(String.class)),
                    "%" + searchData.getValue().toLowerCase() + "%");
        
        return null;
    

附: SearchData 类是带有

的简单 pojo
private String fieldName;
private String value;

还有我的员工服务方法

public List<Employee> getDynamicEmployeeSearch(List<SearchData> searchDataList) 
        List<Employee> employeesList = new ArrayList<>();
        Specification<Employee> specification = new EmployeeSpecification();
        if (searchDataList != null) 
            for (SearchData data : searchDataList) 
                specification = Specification.where(specification).and(new EmployeeSpecification(data));
            
            employeesList = employeeRepository.findAll(specification);
            return employeesList;
        
        return employeesList;
    

我需要返回员工的姓名(或者我在 SearchData 中输入的部分,以及我在第二个 SearchData 中输入的部门代码,但该代码位于另一个具有 OneToMany 关系的表中

【问题讨论】:

【参考方案1】:

已解决。 在 toPredicate 中写入 switch 并添加另一个谓词,当我现在有来自部门的标准时,它将选择部门,当来自员工的标准时,它将选择员工。 在列表中我有正确的数据。只是认为可能存在一些默认值。

【讨论】:

以上是关于在 criteriaBuilder 加入不想正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何通过两个字段加入(CriteriaBuilder)

Hibernate CriteriaBuilder 加入多个表

CriteriaBuilder:在运行时根据 DataType 创建 Criteria

使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列

CriteriaBuilder - 倒置 LIKE

实体列表的 CriteriaBuilder 和 isMember (Hibernate)