标准eclipselink加入

时间:2012-10-23 13:07:46

标签: java eclipselink criteria-api

我无法理解如何加入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?

2 个答案:

答案 0 :(得分:1)

首先,为了获得包含A和B中所有字段的结果列表,您需要将结果整形为Tuple列表或Object列表,如此处所述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

答案 1 :(得分:0)

如果您想要的只是“从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的aid属性上定义的关系为您创建A-&gt; B表连接,因此您不需要。返回A将完成,除了因为您在bCollection映射上使用默认提取类型,Bs可能会延迟提取。如果您希望它们在单个查询中急切地引入并与As关联,请使用fetch方法而不是join:

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