Ниже много написано для того, что я считаю довольно простой проблемой. Корень проблемы - мое невежество, я не столько ищу код, сколько совет.
Таблица: столбец 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), и в этот момент нет доступного Entity Manager. На данный момент я не позволил объекту сериализовать столбец соединения, но теперь мне не хватает критической части данных.
Я думаю, что сказал слишком много, но недостаточно зная, я не знаю, что вам нужно экспертам JPA. Я хотел бы, чтобы мой исходный объект имел как строковый объект, так и мог соединяться в одном столбце (ihtran), но если это невозможно или целесообразно, я хочу услышать, что я должен делать и почему.
Псевдокод / английский более чем хорошо.