Openjpa criteriaBuilder выборка вложенных свойств объекта

есть ли способ в 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("Y.Z")

CriteriaBuilder не знает, чтобы получить Z рефлексивно (однако он может и разрешит Y). Есть ли способ получить Z непосредственно из get ()?

Помимо использования JPQL, я могу думать еще один метод , который мне очень не нравится: я полагаю, что мог бы разоблачить Z как @Transient свойство в X (чтобы предотвратить сохранение OpenJPA в виде столбца), но это звучит как очень плохая идея: я по существу выравниваю график объектов вручную и вводлю ненужный мусор внутри компонента сущности, не считая времени, необходимого для выравнивания сложного графика или ошибки этого (это может пойти наперекосяк во многих отношениях).

есть ли способ заставить это работать? Любой идеи ценятся.

1 ответов


Хех, решение удивительно простое - и оно выглядит действительно уродливым, но оно работает.

predicate1 = criteriaBuilder.and(predicate1, criteriaBuilder.equal(rootObj.get("Y").<String> get("Z"), param1));}

Я действительно не знаю, если есть более элегантное решение для этого.