API критериев JPA 2: как выбрать значения из различных объединенных таблиц без использования метамодели?

У меня есть следующий тип запроса, который я хочу преобразовать в запрос критериев jpa и следующую структуру таблицы:

Table A 1-->1 Table B  1<--* Table C (proceedings) *-->1 Table D(prcoeedingsstatus)
--------      --------       -------                     -------
 aID           bID           cID                         dID
 ...           ....          timestamp                   textValue
 f_bID         ....          f_bID       
                             f_dID

1 A имеет 1 B, 1 B имеет много производств, и каждое разбирательство имеет статус производства.

SELECT a.*

FROM ((a LEFT JOIN b ON a.f_b = b.id)
        LEFT JOIN proceedings ON b.id = proceedings.f_b)
        RIGHT JOIN proceedingsstatus ON proceedings.f_d = proceedingsstatus.id

WHERE   d.textValue IN ("some unique text")
        AND c.timestamp BETWEEN 'somedate' AND 'anotherdate'

Когда я сейчас пытаюсь сделать что-то подобное для предикатов:

Predicate conditions = (root.join("tableB")
                            .joinList("proceedings")
                            .join("proceedingsstatus").get("textValue"))
                            .in(constraintList.getSelectedValues());

Predicate time = cb.between((root.join("tableB")
                            .joinList("proceedings")
                            .<Date>get("timestamp")), dt1.toDate(), dt2.toDate());

constraints = cb.and(conditions, time);

Прямо сейчас он выбирает записи A, в которых есть хотя бы 1 вхождение правильного статуса процесса в соответствии с предикатом условий, если в любом из процессов A «метка времени» соответствует предикату времени, который я построил. Таким образом, он также выбрал бы запись A, когда C.timestamp является правильным для продолжения с неправильным textValue в D, если есть хотя бы одна запись C, принадлежащая A с правильным текстовым значением в D.

Как я могу изменить его так, чтобы он выбирал только те A, где статус производства имеет правильное значение И время поступления является правильным?


person random_error    schedule 07.11.2012    source источник


Ответы (1)


Повторно используйте соединения вместо создания новых для каждого предиката.

Join proceedings = root.join("tableB").joinList("proceedings");
person Chris    schedule 07.11.2012
comment
спасибо за ответ, завтра попробую и напишу, если поможет. - person random_error; 10.11.2012
comment
Итак, попробовал, сделал именно то, что хотел, большое спасибо! - person random_error; 10.11.2012