Java 如何使用JPA检索多个对象?
我将JPA2/hibernate用于此数据模型: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对
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);
}