Я пытаюсь сделать запрос соотнесенным с критерием-API, который включает в себя объединение двух таблиц сотрудник и документы. Цель состоит в том, чтобы получить записи с самой последней датой в «DATE_ULT_ACTUALIZ» таблицы документов.
Код DDL таблиц:
CREATE TABLE `employee` (
`emp_id` int(11) NOT NULL,
`emp_name` varchar(120) DEFAULT NULL,
`emp_salary` double NOT NULL,
`emp_desig` varchar(200) DEFAULT NULL
PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `documentos` (
`cod_documento` int(11) NOT NULL,
`emp_id` int(11) NOT NULL,
`valor` varchar(200) DEFAULT NULL,
`FECHA_ULT_ACTUALIZ` datetime DEFAULT NULL,
PRIMARY KEY (`cod_documento`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
SQL-запрос, которым я являюсьпопытка выполнить с помощью Criteria-api выглядит следующим образом:
SELECT DISTINCT e.emp_id, d.valor, d.FECHA_ULT_ACTUALIZ
FROM employee e
inner join documentos d
on e.emp_id = d.emp_id
where d.FECHA_ULT_ACTUALIZ = (select max(FECHA_ULT_ACTUALIZ) from documentos d where e.emp_id = d.emp_id);
Return:
101 txt1 2019-10-13 01:01:00
102 txt3 2019-10-12 00:00:00
Мой код Java выглядит следующим образом:
...
..
public class CriteriaBuilderDemo {
private static final String PERSISTENCE_UNIT_NAME = "JPACriteriaBuilder";
private static EntityManager entityMgrObj = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME).createEntityManager();
public static void main(String[] args) {
CriteriaBuilder criteriaBuilderObj = entityMgrObj.getCriteriaBuilder();
CriteriaQuery<Employee> q = criteriaBuilderObj.createQuery(Employee.class);
Root<Employee> customer = q.from(Employee.class);
Subquery<Date> sq = q.subquery(Date.class);
Root<Employee> customerSub = sq.correlate(customer);
Join<Employee,Documentos> order = customerSub.join("emp_id", JoinType.INNER);
q.where(criteriaBuilderObj.equal(
sq.select(criteriaBuilderObj.greatest(sq.<Date>get("fechaUltActualiz")), customer.<Date>get("fechaUltActualiz"))))
.select(customer);
TypedQuery query3 = entityMgrObj.createQuery(q);
List empList = query3.getResultList();
if(empList != null && empList.size() > 0) {
for(Object obj : empList) {
Employee emp3 = (Employee)obj;
System.out.println(emp3.toString());
}
} else {
System.out.println("! ALERT - No Employees Are Present In The 'Employee' Table !");
}
}
}
Я не знаю, что я делаю неправильно, но когдаЯ решаю ошибки компиляции, запрос SQL, сгенерированный Criteria-API, не является запросом SQL, который мне нужен.