Java 在可选的OneTONE连接场景中,如何获取没有B的实体a?

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代码,我得到了如下内容(特意精简): 我明白这背后的逻辑。然而,这绝对不会对我的最后一个案例起作用。我想知道如何绕过这个用例?有什么帮助吗 标准是以编程方式构建的,以下是手动构建时的情

我有一个类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();