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

标签 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;
}

我想检索包含 Stock 的 StockGroup,其中 visible==true
我想出了这个错误的代码:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<StockGroup> q = cb.createQuery(StockGroup.class);
Root<StockGroup> r = q.from(StockGroup.class);
Join<StockGroup, Stock> j = r.join(StockGroup_.stocks, JoinType.INNER);
Predicate p = cb.equal(j.get(Stock_.visible), true);

// This becomes a cartesian product :(
List<StockGroup> l = em.createQuery(q.where(p)).getResultList();   
// Stocks are not filtered on visible :(
l.get(0).getStocks();

是否可以使用一个 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();

元组不是完全类型安全的,但您可以通过位置访问它(或通过别名,如果您已为选择表达式或根指定别名):

for (Tuple t : l) {
    Stock s = (Stock) t.get(0);
    StockGroup sg = (StockGroup) t.get(1);

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

有一个 good article on IBM DeveloperWorks on JPA2 Typesafe Queries .

祝您在 JPA2 的努力中好运!

关于java - 如何使用 JPA 检索多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4653070/

相关文章:

python - Django select_lated 通过单个查询连接模型属性

entity-framework - 具有基于文件的数据库的 Entity Framework

java - 如何通过持久性动态配置数据库连接

hibernate - JPQL 中的 HQL 'with' 子句

java - hibernate 不加载关联对象

java - HashSet 似乎没有意识到两个对象是相同的。

Java从表中读取

java - 具有自定义类属性的 Netbeans 自定义组件

java - 如何保留不同类型的函数和参数

java - 当键的一个元素是实体时,如何在 JPA 中声明复合键?