问题
This works fine:
public Predicate toPredicate(Root<Campaign> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
return root.get("campState").get("statusId").in(campStatus);
}
but I change to :
return root.get(Campaign_.campState).get(CampState_.campId).in(campStatus).
And it throws exception:
edit for: NullPointerException at org.hibernate.ejb.criteria.path.AbstractPathImpl.get
@StaticMetamodel(Campaign.class)
public class Campaign_ {
public static volatile SingularAttribute<Campaign, CampState> campState;
public static volatile SingularAttribute<Campaign, Long> campId;
}
@StaticMetamodel(CampState.class)
public class CampState_ {
public static volatile SingularAttribute<CampState, String> statusId;
}
Campaign.class
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.MERGE})
@JoinColumn(name = "camp_status")
public CampState getCampState() {
return campState;
}
public void setCampState(CampState campState) {
this.campState = campState;
}
回答1:
Given two queries operate to different attributes. Second query cannot be compiled, because CampState_ does not have attribute campId (Campaign_ does have such a attribute.
Query that is equivalent to first one with static metamodel is:
root.get(Campaign_.campState).get(CampState_.statusId).in(campStatus).
回答2:
check this answer.
seems like metamodel and class should be at the same package
来源:https://stackoverflow.com/questions/14554945/nullpointerexception-at-org-hibernate-ejb-criteria-path-abstractpathimpl-get