Тема: Hibernate CriteriaBuilder i inner join
Доброго дня, товариство.
Не можу ніяк розібратися, як зробити простий запит, ось такого плану, але з допомогою CriteriaBuilder в Hibernate.
SELECT units.model, works.task, works.opened
FROM works inner join units on works.unit_id = units.id_unit
where opened = 1;
MySQL видає ось таку таблицю(з ліва), а код який генерує запит(з права) приведу нижче
CriteriaQuery<Work> cq = builder.createQuery(Work.class);
Root<Work> rootW = cq.from(Work.class);
rootW.join("unit");
cq.where(builder.equal(rootW.get("opened"), true));
Query<Work> query1 = session.createQuery(cq);
List<Work> resultList1 = query1.getResultList();
resultList1.forEach((w)->{ System.out.println("\t"+ w.getTask()); });
Отож, як згенерувати запит так, щоб було поле units.model. зв'язок між таблицями, як видно по ентиті, OneToMany, тобто один Unit має багато WORKів.
// Unit.java
@Entity
@Table(name = "units")
public class Unit {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_unit")
private int idUnit;
@Column(name = "model")
private String model;
@OneToMany(mappedBy = "unit", cascade = CascadeType.ALL)
private List<Work> works = new ArrayList<Work>();
// далі ідуть Getters i Setters}
// Work.java
@Entity
@Table(name = "works")
public class Work {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_work")
private int idWork;
@Column(name = "task")
private String task;
@Column(name = "opened")
private boolean opened;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "unit_id")
private Unit unit;
}