КонтекстРегистрация декартово произведение
Я посылаю некоторые файлы на некоторых предприятиях каждую неделю. Мне нужно каждую неделю и каждое предприятие резервировать, отправлен ли файл или нет.
Столы
- лор (предприятие)
- WEK (неделя)
- фил (файл: ссылки Wek и ЛОР)
Решение с чистым SQL
Сделайте карточку ian продукт между ent и wek затем левое внешнее соединение fil. Это работает:
select * from
(
select * from wek, ent e
) as t1
left join fil f
on f.ent_id = t1.ent_id
and f.wek_id = t1.wek_id
Проблема:
Как перевести это в JPA (в CriteriaBuilder пути)?
Например, если я стараюсь:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ResultClass> query = cb.createQuery(ResultClass.class);
Root<Week> week = query.from(Week.class);
Root<Enterprise> query.from(Enterprise.class);
Expression<???> cartesianProduct = ??? //How?
cartesianProduct.leftJoin(???_.file);
query.where(
cb.equal(file.get(File_.wek_id), week.get(Week.week_id));
)
Использование 2 «из» пунктов дает мне декартово произведение, но как я оставил присоединиться к этому результату?
Unstatisfaying решение:
Создать вид:
CREATE VIEW view_ent_wek AS
SELECT ent_id as ent_id, wek_id as wek_id, ent_id || '-' || ent_id as id
FROM ent, wek;
сопоставляет его сущность:
@Entity
@Table(name = "view_ent_wek")
public class WeekEnterprise {
@Id
@Column(name = "id")
private String id;
@ManyToOne
@JoinColumn(name = "ent_id")
private Enterprise enterprise;
@ManyToOne
@JoinColumn(name = "wek_id")
private Week week;
[...]
Тогда я могу использовать его в запросе:
Root<WeekEnterprise> weekEnterprise = query.from(WeekEnterprise.class);
weekEnterprise.join(...)
Мне не нравится это решение, потому что это заставляет меня создать представление, которое, очевидно, не нужно. Есть идеи?
Попробуйте использовать [CriteriaQuery MultiSelect] (https://docs.oracle.com/javaee/6/api/javax/persistence/criteria/CriteriaQuery.html#multiselect (javax.persistence.criteria.Selection ...)). Проверьте [Критерии присоединения запросов] (http://www.objectdb.com/java/jpa/query/jpql/from) –
OO7
Не уверен, но вы можете попробовать это. Учитывая, что u hv 'Test2' является классом' JoinColumn' в классе 'Test1'. Попробуйте этот корень root = criteria.from (Test1.class); root.get ("test2Object"). Get ("test1FieldInTest2"); '. Я думаю, что это дает перекрестное соединение между 'Test1' и' Test2'. –
OO7
Что именно вы хотите вернуть из своего запроса JPA. Я имею в виду, вам нужны столбцы или сами Сущности? Например, вам нужны только идентификаторы 'ent' и' wek', за которыми следует (возможно, нулевой) объект 'fil'? Или вы хотите вернуть объекты 'ent',' wek' и (возможно, null) 'fil'? – DuncanKinnear