Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA检索多个对象?_Java_Hibernate_Orm_Jpa_Jpa 2.0 - Fatal编程技术网

Java 如何使用JPA检索多个对象?

Java 如何使用JPA检索多个对象?,java,hibernate,orm,jpa,jpa-2.0,Java,Hibernate,Orm,Jpa,Jpa 2.0,我将JPA2/hibernate用于此数据模型: class Stock { @ManyToOne private StockGroup stockGroup; private boolean visible; } class StockGroup { @OneToMany(mappedBy = "stockGroup") private List<Stock> stocks; } 是否可以使用一个CriteriaQuery检索StockGroup和Stock对

我将JPA2/hibernate用于此数据模型:

class Stock {
  @ManyToOne
  private StockGroup stockGroup;
  private boolean visible;
}
class StockGroup {
  @OneToMany(mappedBy = "stockGroup")
  private List<Stock> stocks;
}

是否可以使用一个CriteriaQuery检索StockGroup和Stock对象,或者JPA一次只能填充一种类型?或者,当
.getStocks()
被延迟填充时,我可以添加一些条件吗?

执行此操作的技巧是返回一个元组,其中包含Stock和StockGroup之间的老式联接,如下所示:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createQuery(Tuple.class);
Root<Stock> sRoot = q.from(Stock.class);
Root<StockGroup> sgRoot = q.from(StockGroup.class);

q.select(cb.tuple(sRoot, sgRoot)).where(
    cb.and(cb.equal(sRoot.get(Stock_.stockGroup), sgRoot),
        cb.isTrue(sRoot.get(Stock_.visible))));
List<Tuple> l = em.createQuery(q).getResultList();
有一个


祝你在JPA2的努力中好运

如果我害怕这个。。。手动连接、不安全强制转换、vebose语法和手动组合对象。也许我需要切换到OpenJPA或Querydsl之类的东西。但是,你仍然完美地回答了我的问题(我已经阅读了enitre的文章)。如果回答第二部分,您将获得额外的积分:如果我首先只检索StockGroups,那么在调用.getStocks()时我可以添加一些条件吗?换句话说,我可以处理代理对象吗?我认为JPA不支持这个功能——因为JPA中没有这样的构造(过滤的集合),因为在对象中会得到一个不完整的集合。我也不知道OpenJPA会如何帮助您,而且我对QueryDsl了解不够,无法提供建议。很抱歉但是,您可以添加一些更高级的方法/助手来进行手动连接,例如MaulalEngin(CB、SGROOT、SROOT、Stordy.GROUP、CB、ISTIUE(SROOT,GET(Sturgy.VIEW))),并将相应的元组列表包装为各种类型的助写器。遗憾的是,他们没有制作Tuple1、Tuple2等。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createQuery(Tuple.class);
Root<Stock> sRoot = q.from(Stock.class);
Root<StockGroup> sgRoot = q.from(StockGroup.class);

q.select(cb.tuple(sRoot, sgRoot)).where(
    cb.and(cb.equal(sRoot.get(Stock_.stockGroup), sgRoot),
        cb.isTrue(sRoot.get(Stock_.visible))));
List<Tuple> l = em.createQuery(q).getResultList();
for (Tuple t : l) {
    Stock s = (Stock) t.get(0);
    StockGroup sg = (StockGroup) t.get(1);

    System.out.println("Stock is : " + s + "    .... StockGroup: " + sg);
}