java - JPA 2 Criteria Fetch Path Navigation

标签 java jpa jpa-2.0 fetch

使用 JPA 2 Criteria Join 方法,我可以执行以下操作:

    //Join Example (default inner join)
    int age = 25;
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Team> c = cb.createQuery(Team.class);
    Root<Team> t = c.from(Team.class);
    Join<Team, Player> p = t.join(Team_.players);
    c.select(t).where(cb.equal(p.get(Player_.age), age));
    TypedQuery<Team> q = entityManager.createQuery(c);
    List<Team> result = q.getResultList();

我怎样才能用 fetch 方法做同样的事情,我希望 Fetch 接口(interface)有路径导航的 get 方法,但它没有:

    //Fetch Join Example

    int age = 25;
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Team> cq = cb.createQuery(Team.class);
    Root<Team> t = cq.from(Team.class);
    Fetch<Team,Player> p = t.fetch(Team_.players);
    cq.where(cb.equal(p.get(Player_.age), age)); //This leads to compilation error there is no such method get in interface Fetch
    TypedQuery<Team> q = entityManager.createQuery(cq);
    List<Team> result = q.getResultList();

根据 Hiberante Documentation fetch 返回一个错误的 Join 对象。 http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/querycriteria.html#querycriteria-from-fetch

最佳答案

同意您对这种方法的看法,以及您希望它允许您所说的事实。另一种选择是

Join<Team, Player> p = t.join(Team_.players);
t.fetch(Team_.players);
c.select(t).where(cb.equal(p.get(Player_.age), age));

即执行一个 join(),为其添加一个 fetch(),然后使用该连接。这是不合逻辑的,只会增加 JPA 标准的不雅性,但无论如何,应该是一种解决方法

关于java - JPA 2 Criteria Fetch Path Navigation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4511368/

相关文章:

java - 如何删除 <p : tree of primefaces? 中的节点

java - 如何将自定义菜单栏项放置在 map 菜单中的所需位置

hibernate - 使用条件查询检索多态 Hibernate 对象

hibernate - JPA Hibernate 多对多级联

java - 使用 Hibernate 更新查询性能

java - JPA 多对多查询

java - Java中使用SAX解析器同时读取父级和子级

java - EasyMock:如何在没有警告的情况下创建泛型类的模拟?

hibernate - EntityManager.find 找不到实体,但使用 Criteria API 可以

java - JPA2(JBoss7.1的Hibernate)entityManager.find()从缓存而不是从数据库获取数据