如何使用criteria builder在Java上进行连接
我有一个数据库,需要使用CriteriaBuilder从Java进行连接 到目前为止,我有以下代码:如何使用criteria builder在Java上进行连接,java,eclipse,join,spring-boot,Java,Eclipse,Join,Spring Boot,我有一个数据库,需要使用CriteriaBuilder从Java进行连接 到目前为止,我有以下代码: CriteriaBuilder cb = entman.getCriteriaBuilder(); CriteriaQuery<Company> query = cb.createQuery(Company.class); Root<Employee> teacher = query.from(Employee.class); Join<Em
CriteriaBuilder cb = entman.getCriteriaBuilder();
CriteriaQuery<Company> query = cb.createQuery(Company.class);
Root<Employee> teacher = query.from(Employee.class);
Join<Employee, Company> employees = teacher.join("id");
query.select(employees).where(cb.equal(teacher.get("name"), ""));
List<Company> results = entman.createQuery(query).getResultList();
return results;
公司:
@Entity
public class Company {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
@Size(min = 1)
private String name;
@OneToMany(mappedBy="company", cascade = CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval=true)
private Collection<Employee> employees;
public Company() {}
public Company(Long id, String name) {
setId(id);
setName(name);
}
public Company(Long id, String name, Collection<Employee> employees) {
setId(id);
setName(name);
setEmployees(employees);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<Employee> getEmployees()
{
return employees;
}
public void setEmployees(Collection<Employee> employees) {
this.employees = employees;
}
@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", employees=" + employees.toString() + "]";
}
}
@实体
公营公司{
@身份证
@生成值
私人长id;
@列(nullable=false)
@尺寸(最小值=1)
私有字符串名称;
@OneToMany(mappedBy=“company”,cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphan=true)
私人收藏员工;
上市公司(){}
上市公司(长id,字符串名称){
setId(id);
集合名(名称);
}
上市公司(长id、字符串名称、集合员工){
setId(id);
集合名(名称);
雇员(雇员);
}
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共集合getEmployees()
{
返回员工;
}
公共雇员(收款雇员){
这是。雇员=雇员;
}
@凌驾
公共字符串toString(){
返回“Company[id=“+id+”,name=“+name+”,employees=“+employees.toString()+”];
}
}
您需要一个教师
元素,而不是对id
的引用,因为您不能加入@列
字段
将id映射从@列更改为:
@Column(name = "id")
private Integer id;
与@ManyToOne
(或所需的)关联:
@ManyToOne
@JoinColumn(name = "id")
private Teacher teacher;
在此之后,您的加入将按预期工作。我在这里回答了类似的问题:@AlexanderPetrov感谢您的回复,我已经读过了,但这并没有帮助我理解我错在哪里……是的,同事的吼叫是正确的。不能通过@Basic列映射进行联接。你需要加入这段关系。你需要加入老师的行列。我正确地添加了这些注释(我想),但似乎我有一个稍微新的错误。。。映射实体:entity.Employee列:id(应使用insert=“false”update=“false”进行映射)中的重复列我应该看到您的实体,但如果您有它,请删除公司
实体中Employee.id
的映射,只映射员工
。。。如果没有,请共享员工
和公司
类和映射公司实体:@R3muSGFX请编辑您的问题(如果可能,请发布代码,而不是图像!)我添加了代码。屏幕截图来自数据库。
@ManyToOne
@JoinColumn(name = "id")
private Teacher teacher;