【问题标题】:Criteria eclipselink join条件 eclipselink 加入
【发布时间】:2012-10-23 13:07:45
【问题描述】:

我不明白如何加入 eclipse 链接与标准。 这是我的实体:

public class A implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "id")
  private Long id;
  @Column(name = "value")
  private String value;   

  @OneToMany(mappedBy = "aid")
  private Collection<B> bCollection; 
}

public class B implements Serializable {

  @Id      
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "id")
  private Long id;

  @JoinColumn(name = "a_id", referencedColumnName = "id")
  @ManyToOne
  private A aid;  
}

我这样做:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery();
    Root<A> a = cq.from(A.class);
    Join<A, B> j = a.join("aid",JoinType.INNER);
    cq.distinct(true);
    //and now what?        
    cq.where(cb.equal(a.get("id"), "aid"));
    Object r = em.createQuery(cq).getResultList();

现在,如何将我的 join 子句绑定到 CriteriaQuery?

【问题讨论】:

  • 'p' 未定义,不清楚您要查询什么或为什么需要加入。你想获取 b 和 A 吗?即“从 A 中选择一个 a 连接 fetch a.bCollection where a.id = :aid”?还是只是一个内部连接,所以 A 必须有一个 b?
  • 正确的'p'。我试图获得 A 类,谁在 bCollection 中有 B 类。或类似的东西: Select * from A a inner join B b on a.id = b.aid (我需要 A 实体或 ArrayList 中 A 和 B 的所有字段,这并不重要)

标签: java eclipselink criteria-api


【解决方案1】:

首先,为了获得包含来自 A 和 B 的所有字段的结果列表,您需要将结果塑造为Tuples 列表或Objects 列表,如article 中所述( 预测结果一章)。

这需要使用multiselect 语句或使用construct,如下所示:

cq.multiselect(a, b));
cq.select(cb.construct(a, b));

应该像这样获得b:

CollectionJoin<A, B> b = a.join(A_.bCollection, JoinType.INNER);  // using Metamodel

【讨论】:

  • 谢谢,但在那之后我得到了一个包含 Object[] { A, B} 的向量,我不知道下一步该怎么做;
  • @Terence 很遗憾,我今天无法为您提供更多帮助,但我相信您可以从我链接的文章中了解更多信息。告诉我
  • 我使用 CriteriaQuery cq = cb.createTupleQuery(); ... List 结果 = em.createQuery(q).getResultList();一切正常,谢谢。
【解决方案2】:

如果您只需要“从 A 中选择 a 并加入 a.bCollection”,从而只返回 As 和 B,那么您只需要:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> a = cq.from(A.class);
Join<A, B> j = a.join("bcollection",JoinType.INNER);
cq.distinct(true);
Object r = em.createQuery(cq).getResultList();

JPA 将使用 B 的辅助属性上定义的关系为您创建 A->B 表连接,因此您不需要。返回的 A 将是完整的,除了由于您在 bCollection 映射上使用默认获取类型,Bs 可能会延迟获取。如果您希望它们在单个查询中急切地引入并关联到 As,请使用 fetch 方法而不是 join:

a.fetch("bcollection",JoinType.INNER);

【讨论】:

  • 如果我使用这个,那么在插入一个新对象之后(像这样:A a = new A(); em.persist(a); B b = new B(); b.aid = A; em.persist(b);) 然后得到A fetch B,A bCollection 为空。
  • 是的。您必须维护 a 的 B 集合。它是一个普通的 java 对象,所以如果你想在其中看到 b ,你必须添加它或从数据库中刷新 a 。尝试使用 em.refresh(a)
猜你喜欢
  • 2013-09-19
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2020-12-07
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多