Ниже приводится много писанины для того, что я считаю довольно простой проблемой. Корень проблемы - мое невежество, ищу не столько код, сколько совет.
Таблица: столбец Ininvhst (история инвентаризации схемы инвентаризации) ihtran (код передачи истории инвентаризации) с использованием старого сопоставления сущностей, которое у меня есть:
@Basic(optional = false)
@Column(name = "IHTRAN")
private String ihtran;
ihtran на самом деле является внешним ключом к таблице Intrnmst («Мастер переноса запасов», которая содержит список «кодов переноса»). Это не было выражено в базе данных, поэтому на Ininvhst было наложено ссылочное ограничение на повторное создание классов сущностей JPA2:
@JoinColumn(name = "IHTRAN", referencedColumnName = "TMCODE", nullable = false)
@ManyToOne(optional = false)
private Intrnmst intrnmst;
Раньше я использовал JPA2 для выбора записей/(сущностей Ininvhst) из таблицы Ininvhst, где «ihtran» был одним из набора значений. Я использовал in.value() для этого... вот фрагмент:
cq = cb.createQuery(Ininvhst.class);
...
In<String> in = cb.in(transactionType); //Get in expression for transacton types
for (String s : transactionTypes) { //has a value
in = in.value(s);//check if the strings we are looking for exist in the transfer master
}
predicateList.add(in);
Моя проблема в том, что Ininvhst раньше содержал строку с именем ihtran, но теперь он содержит Ininvhst... Итак, теперь мне нужно выражение пути:
this.predicateList = new ArrayList<Predicate>();
if (transactionTypes != null && transactionTypes.size() > 0) { //list of strings has some values
Path<Intrnmst> intrnmst = root.get(Ininvhst_.intrnmst); //get transfermaster from Ininvhst
Path<String> transactionType = intrnmst.get(Intrnmst_.tmcode); //get transaction types from transfer master
In<String> in = cb.in(transactionType); //Get in expression for transacton types
for (String s : transactionTypes) { //has a value
in = in.value(s);//check if the strings we are looking for exist in the transfer master
}
predicateList.add(in);
}
Могу ли я добавить ihtran обратно в объект вместе со столбцом соединения, в котором обе ссылки являются «IHTRAN»? Или я должен использовать проекцию, чтобы каким-то образом вернуть Ininvhst вместе со строкой ihtran, которая теперь является частью сущности Intrnmst. Или я должен использовать проекцию, чтобы вернуть Ininvhst и каким-то образом ограничить Intrnmst только строкой ihtran.
Дополнительная информация: я использую полученный список выбранных объектов Ininvhst в веб-приложении, класс, содержащий список объектов Ininvhst, преобразуется в объект json. Вероятно, существует довольно много методов сериализации, которые будут перемещаться по графу объектов. Проблема в том, что моя текущая стратегия выборки ленива, поэтому она попадает в сущность соединения (Intrnmst intrnmst), и в этот момент нет доступного диспетчера сущностей. На данный момент я предотвратил сериализацию столбца соединения объектом, но теперь мне не хватает важной части данных.
Я думаю, что сказал слишком много, но не зная достаточно, я не знаю, что вам, экспертам JPA, нужно. Я хотел бы, чтобы мой исходный объект имел как строковый объект, так и возможность присоединиться к одному и тому же столбцу (ihtran), но если это невозможно или нецелесообразно, я хочу услышать, что мне делать и почему.
Псевдокод/английский более чем в порядке.