Как выполнить запрос в соответствии с критериями JPA - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь сделать запрос соотнесенным с критерием-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, который мне нужен.

...