4
OpenJPA有任何方式通過CriteriaBuilder獲取嵌套對象屬性嗎?OpenJPA criteriaBuilder嵌套對象屬性獲取
這是一個小案例。
@Entity
public class X {
private Object Y;
// getters, setters...
}
@Entity
public class Y {
private String Z;
// getters, setters...
}
因此,在使用時CriteriaBuilder,我們使用的是X爲根,即:
@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不知道反思取ž (但它可以並且將解決Y)。有沒有辦法直接從get()獲得Z?除了使用JPQL之外,我還可以想到另一種方法 - 我不喜歡這種方法:我想我可以將Z作爲@Transient
屬性在X中暴露(爲了防止OpenJPA將其作爲列保留),但是聽起來像是一個非常不好的想法:我本質上是手動展開一個對象圖,並在實體bean內部引入不需要的垃圾,而不是計算平坦化一個複雜圖形所需的時間或這種錯誤傾向(它可能會出錯很多方法)。
有沒有辦法讓這項工作?任何想法都表示讚賞。
如果您使用元模型:'predicate1 = criteriaBuilder.and(predicate1,criteriaBuilder.equal(rootObj.get(X_.Y).get(Y_.Z),param1));}' – gertas
但是,不要使用元模型類,我個人發現這種鏈接的語法非常出乎意料,特別是鏈中最後一個getter的類型聲明。可以說,它可以使用反射罩下的反射來更清晰地定義(並且容易使用),但是 - 就像這樣,這種方式將不得不這樣做。 – quantum