Java Criteria Builder - как построить сложный запрос на соединение? - PullRequest
1 голос
/ 13 января 2020

Я новичок в Criteria API (и JAVA в целом, но не будем об этом говорить). Я пытаюсь создать действительно сложный запрос, используя его, который выглядит следующим образом:

 SELECT ac.firstName as firstName, ac.lastName as lastName, du.idNumber as idNumber, du.dateOfBirth as dateOfBirth, du.gender as gender, du.settlement as settlement, du.street as street, du.buildingNumber as buildingNumber, du.id as driverID, pa.phoneNumber as phoneNumber, ea.emailAddress as emailAddress
 FROM newDB.accounts ac
 inner join driver_users du on du.id = ac.id
 inner join phone_authentications pa on pa.identity_id=ac.identity_id
 inner join email_authentications ea on ea.identity_id=ac.identity_id
 where du.idNumber=:searchParams.idNumber and  emailAddress like searchParams.emailAddress

После долгих поисков мне удалось понять синтаксис Criteria API и как с ним работать, но я не уверен в нескольких вещах:

  1. как мне заставить его вытаскивать различные таблицы? Я видел команду "Root", в которой вы определяете таблицу root для извлечения, поэтому я предполагаю, что мой случай должен быть Root<DriverSearchResultDto> root = criteriaBuilder.from(DriverSearchResultDto.class);, но действительно ли это root? Просто предположил, потому что это произошло после предложения "from" ... а как насчет внутренних соединений? как добавить их с указанным условием соединения?

  2. Мой построитель критериев DriverSearchResultDto, который я основал, не является сущностью и не связан напрямую с таблицей, это пользовательский DTO, который я создал для получения результатов запроса. Это нормально? Я просмотрел остальную часть кода, написанного до того, как попал сюда, и все используемые построители критериев являются фактическими сущностями, подключенными к таблицам БД, поэтому я хочу убедиться, что я использую их правильно (поля внутри имеют точно такие же имена, - например, firstName, lastName и т. д. c).

  3. как мне создать «подобное» условие в критериях? Я также не смог найти много информации по этому вопросу.

  4. новый ie вопрос о запросах - я не слишком много работал над sql БД в последнее время. Я не новичок в синтаксисе, но просто не уверен в чем-то: как вы можете видеть, все параметры, которые я хочу извлечь из БД, написаны как ac.lastName as lastName - без изменения имени самого параметра. Это просто странный предыдущий программист, или необходимо при извлечении из нескольких таблиц одновременно (или при других условиях?) Указывать имя параметра, чтобы не включать таблицу? Разве он не знает, как проанализировать ответ в объекте результатов?

Tnx много!

...