Java 在可选的OneTONE连接场景中,如何获取没有B的实体a?
我有一个类a,它有一个指向B类实例的可选链接 为了方便用户,我想过滤显示A类实例的网格输出,使用一个开关可以显示所有As,只显示带有B的As,或者只显示不带B的As 我的抽象DAO通过根据用户对排序/筛选的需求动态构建标准查询来处理这个过程 对于前两个场景效果很好,但是,最后一个场景总是返回空列表 查看生成的SQL代码,我得到了如下内容(特意精简): 我明白这背后的逻辑。然而,这绝对不会对我的最后一个案例起作用。我想知道如何绕过这个用例?有什么帮助吗 标准是以编程方式构建的,以下是手动构建时的情况:Java 在可选的OneTONE连接场景中,如何获取没有B的实体a?,java,hibernate,jakarta-ee,jpa,eclipselink,Java,Hibernate,Jakarta Ee,Jpa,Eclipselink,我有一个类a,它有一个指向B类实例的可选链接 为了方便用户,我想过滤显示A类实例的网格输出,使用一个开关可以显示所有As,只显示带有B的As,或者只显示不带B的As 我的抽象DAO通过根据用户对排序/筛选的需求动态构建标准查询来处理这个过程 对于前两个场景效果很好,但是,最后一个场景总是返回空列表 查看生成的SQL代码,我得到了如下内容(特意精简): 我明白这背后的逻辑。然而,这绝对不会对我的最后一个案例起作用。我想知道如何绕过这个用例?有什么帮助吗 标准是以编程方式构建的,以下是手动构建时的情
final CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<T> cq = getContextQuery(context); // Juste create the base Criteria
Root<T> root = findRoot(cq); // Retrieve the root.
Path p = root.join(part, JoinType.LEFT); // 'part' is the entity to join on, got from metamodel.
cq.where(cb.isNull(p));
return getEntityManager().createQuery(cq).getResultList();
使用实体A=UserProfile和B=Person 我想过滤显示类实例的网格输出,使用一个允许显示所有As的开关
那应该行。让我知道你的实体。也许我可以用实体代码帮助更新主帖子。这会行得通的,但需要大量的工作才能以通用的方式完成。我在寻找一种我错过的神奇方法。事实证明他们的方法并不是神奇的,我必须按照你的建议去做。谢谢
final CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<T> cq = getContextQuery(context); // Juste create the base Criteria
Root<T> root = findRoot(cq); // Retrieve the root.
Path p = root.join(part, JoinType.LEFT); // 'part' is the entity to join on, got from metamodel.
cq.where(cb.isNull(p));
return getEntityManager().createQuery(cq).getResultList();
@Entity
@Table(name = "person")
@Getter
@Setter
public class Person extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
protected Integer id;
@XmlTransient
@OneToOne(optional = true, mappedBy = "person")
private UserProfile user;
}
@Entity
@Table(name = "user_profile")
public class UserProfile extends AbstractEntity implements Authenticated {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
@OneToOne(optional = false)
@JoinColumn(name = "person_id", referencedColumnName = "id")
@Getter
@Setter
private Person person;
}
CriteriaBuilder cb = ...
CriteriaQuery<UserProfile> q = cb.createQuery(UserProfile .class);
Root<UserProfile> userProfile= q.from(UserProfile.class);
q.fetch(userProfile.get("person"), JoinType.LEFT);
q.select(userProfile)
CriteriaBuilder cb = ...
CriteriaQuery<UserProfile> q = cb.createQuery(UserProfile .class);
Root<UserProfile> userProfile= q.from(UserProfile .class);
q.select(userProfile)
q.where(cb.isNotEmpty(userProfile.get("person"));
CriteriaBuilder cb = ...
CriteriaQuery<UserProfile> q = cb.createQuery(UserProfile .class);
Root<UserProfile> userProfile= q.from(UserProfile .class);
Join<UserProfile, Person> person = userProfile.join("person", JoinType.INNER);
q.select(userProfile)
CriteriaBuilder cb = ...
CriteriaQuery<UserProfile> q = cb.createQuery(UserProfile .class);
Root<UserProfile> userProfile= q.from(UserProfile .class);
q.select(userProfile)
q.where(cb.isEmpty(userProfile.get("person"));
CriteriaBuilder cb = ...
CriteriaQuery<UserProfile> q = cb.createQuery(UserProfile .class);
Root<UserProfile> userProfile= q.from(UserProfile .class);
Join<UserProfile, Person> person = userProfile.join("person", JoinType.lEFT);
q.select(userProfile)
return getEntityManager().createQuery(q).getResultList();