У меня есть две таблицы:
Сотрудник
id
firstName
lastName
.
.
.
Обучение
id
employeeId
trainingName
trainingSuspsnseDate
trainingComplete
Когда я выполняю стандартный SQL запрос в MySQL Workbench, это выглядит так:
SELECT e.id, e.firstName, e.lastName, t.trainingName, t.trainingSuspenseDate, t.trainingComplete
FROM Employee e
JOIN Training t on t.employeeId = e.id
WHERE t.trainingSuspenseDate < CURDATE()
order by t.trainingSuspenseDate;
Теперь я хочу создать критерий запроса для того же запроса SQL, но у меня возникли проблемы с объединением , Вот что я попробовал, основываясь на своем поиске:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Employee> employeeQuery = builder.createQuery(Employee.class);
Root<Employee> employee = employeeQuery.from(Employee.class);
Join<Employee, Training> training = employee.join(Employee_.ID);
employeeQuery.select(builder.construct(Employee.class,
employee.get(Employee_.ID),
employee.get(Employee_.firstName),
employee.get(Employee_.lastName),
training.get(Training_trainingName),
training.get(Training_trainingSuspsnseDate),
training.get(Training_trainingComplete)));
Однако я получаю сообщение об ошибке:
incompatible types: inference variable Y has incompatible equality constraints Templates,Integer where Y,X are type-variables:
Y extends Object declared in method <Y>join(SingularAttribute<? super X,Y>)
X extends Object declared in interface From
Я пробовал другие перестановки JOIN
, но я получить разные ошибки. Я не могу найти точный «секрет» для создания этого запроса.
Join<Employee, Training> training = training.join(Training_.employeeId);
или
Join<Employee, Training> training = training.join(Training_.employeeId).join(Employee_.ID);
или
Join<Training, Employee> training = training.join(Training_.employeeId);
или
Join<Training, Employee> training = training.join(Training_.employeeId).join(Employee_.ID);
или
.
.
.
РЕДАКТИРОВАТЬ: Добавлены мои классы моделей
Сотрудник. java
@Entity
@Table(name = "employee")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e"),
@NamedQuery(name = "Employee.deleteAll", query = "DELETE FROM Employee e"),
@NamedQuery(name = "Employee.countAll", query = "SELECT COUNT(e.ID) FROM Employee e")
})
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue
@Column(name = "id")
private Integer ID;
@Basic(optional = true)
@Column(name = "name_first")
private String firstName;
@Basic(optional = true)
@Column(name = "name_last")
private String lastName;
@Basic(optional = true)
@Column(name = "created_date")
private String employeeDate;
@Basic(optional = true)
@Column(name = "personal_type")
private String personnelType;
public Employee() {
ID = 0;
}
public Employee(Integer id) {
this.ID = id;
}
public Integer getID() {
return ID;
}
public void setID(Integer id) {
this.ID = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmployeeDate() {
return employeeDate;
}
public void setEmployeeDate(String employeeDate) {
this.employeeDate = employeeDate;
}
public String getPersonnelType() {
return personnelType;
}
public void setPersonnelType(String personnelType) {
this.personnelType = personnelType;
}
}
Обучение. java
@Entity
@Table(name = "training")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Training.findAll", query = "SELECT t FROM Training t"),
@NamedQuery(name = "Training.deleteAll", query = "DELETE FROM Training t"),
@NamedQuery(name = "Training.countAll", query = "SELECT COUNT(t.ID) FROM Training t")
})
public class Training implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@GeneratedValue
@Column(name = "ID")
private Integer ID;
@Basic(optional = false)
@Column(name = "employee_id")
private String employeeId;
@Basic(optional = false)
@Column(name = "training_name")
private String trainingName;
@Basic(optional = false)
@Column(name = "training_suspense_date")
private Date trainingSuspenseDate;
@Basic(optional = false)
@Column(name = "training_complete")
private Boolean trainingComplete;
public Integer getID() {
return ID;
}
public void setID(Integer ID) {
this.ID = ID;
}
public String getEmployeeId() {
return employeeId;
}
public void setEmployeeId(String employeeId) {
this.employeeId = employeeId;
}
public void setTrainingName(String trainingName) {
this.trainingName = trainingName;
}
public String getTrainingName() {
return trainingName;
}
public void setTrainingSuspenseDate(Date trainingSuspsenseDate) {
this.trainingSuspsenseDate = trainingSuspsenseDate;
}
public Date getTrainingSuspenseDate() {
return trainingSuspsenseDate;
}
public void setTrainingComplete(Boolean trainingComplete) {
this.trainingComplete = trainingComplete;
}
public Boolean getTrainingComplete() {
return trainingComplete;
}
}