在 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 类是带有
的简单 pojoprivate 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 加入不想正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate CriteriaBuilder 加入多个表
CriteriaBuilder:在运行时根据 DataType 创建 Criteria
使用 CriteriaBuilder 的 JPA 计数(*)。如何使用 CriteriaBuilder 检索 count(*) 列