【问题标题】:How to make a join on Java with criteria builder如何使用标准构建器加入 Java
【发布时间】:2016-07-18 11:26:08
【问题描述】:

我有一个数据库,我需要使用 CriteriaBuilder 从 Java 进行联接。

到目前为止我有这个代码:

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;

在我运行这段代码后(使用 springboot)我得到这个错误:Cannot join to attribute of basic type

有谁知道我应该怎么做才能让它工作?

PS:如果需要,我会提供任何其他信息。 提前致谢。 company database employee database

L.E.: 员工:

@Entity
public class Employee {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false)
    @Size(min = 1)
    private String name;

    @Column(nullable = false)
    @Temporal(TemporalType.DATE)
    private Date hire_date;

    @ManyToOne
    //@JoinColumn(name = "id")
    private Company company;

    public Employee() {}

    public Employee(Long id, String name, Date date, Company company) {
        setId(id);
        setName(name);
        setHire_date(date);
        setCompany(company);
    }

    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 Date getHire_date() {
        return hire_date;
    }

    public void setHire_date(Date hire_date) {
        this.hire_date = hire_date;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }
}

公司:

@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() + "]";
    }

}

【问题讨论】:

  • 我在这里回答了类似的问题:stackoverflow.com/questions/38251392/…
  • @AlexanderPetrov 谢谢你的回复,我已经读过了,但这并没有帮助我理解我错在哪里......
  • 是的,下面的同事是正确的。您不能通过 @Basic 列映射加入。你需要加入这种关系。你需要加入老师。

标签: java eclipse join spring-boot


【解决方案1】:

您需要有一个Teacher 元素,而不是对id 的引用,因为您不能加入@Column 字段...

@Column更改id映射:

@Column(name = "id")
private Integer id;

带有@ManyToOne(或需要的)关联:

@ManyToOne
@JoinColumn(name = "id")
private Teacher teacher;

在此之后,您的 join 将按预期工作。

【讨论】:

  • 我正确添加了这些注释(我认为),但似乎我有一个稍微新的错误...实体映射中的重复列:entity.Employee 列:id(应该使用 insert= 映射“假”更新=“假”)
  • 我应该看到你的实体,但如果你有它删除Company实体中Employee.id的映射,只需映射Employee...如果没有,请分享@987654332 @ 和 Company 类和映射
  • 公司实体:
  • @R3muSGFX 请编辑您的问题(如果可能,请发布代码,而不是图片!)
  • 我添加了代码。截图来自数据库。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多