Есть ли способ в OpenJPA получить свойство вложенного объекта через CriteriaBuilder?
Вот небольшой случай.
@Entity
public class X {
private Object Y;
// getters, setters...
}
@Entity
public class Y {
private String Z;
// getters, setters...
}
Итак, при использовании CriteriaBuilder мы используем X как Root, то есть:
@PersistenceContext
private EntityManager entityManager;
//.....
Root<X> rootObj = criteriaBuilder.from(X.class);
CriteriaQuery<X> select;
String param1 = X.getY().getZ();
// initializing predicate, default value is TRUE
Predicate predicate1 = criteriaBuilder.isNull(null);
// construct search predicate which fails miserably due to IllegalArgumentExecption
if (X != null) {
predicate1 = criteriaBuilder.and(predicate1, criteriaBuilder.equal(rootObj.<String> get("Y.Z"), param1));}
Теперь мое горе -> get ("YZ")
CriteriaBuilder не знает, как получить Z рефлексивно (однако он может и разрешит Y). Есть ли способ получить Z прямо из get ()?
Помимо использования JPQL, я могу придумать еще один метод, который мне очень не нравится: я полагаю, я мог бы раскрыть Z как @Transient
в X (чтобы не дать OpenJPA сохранить его как столбец), но это звучит как действительно плохая идея: я по сути сглаживаю граф объекта вручную и добавляю ненужный мусор внутри entity-компонента, не считая времени необходимо выровнять сложный граф или его склонность к ошибкам (это может пойти не так по-разному).
Есть ли способ заставить эту работу работать? Любые идеи приветствуются.