在fetch throws之后的条件api连接无效的路径错误

时间:2017-12-21 22:44:49

标签: hibernate jpa hibernate-criteria criteria-api

我有三个简单的实体:

@Entity
public class Category {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @OneToMany(fetch = FetchType.LAZY)
    private List<Subject> subjects;
}

@Entity
public class Subject {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @OneToMany(fetch = FetchType.LAZY)
    private List<Topic> topics;
}


@Entity
public class Topic {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

我使用标准api来获取数据。我需要预先提取主题。

CriteriaBuilder cb = this.em.getCriteriaBuilder();
CriteriaQuery<Category> cq = cb.createQuery(Category.class);
Root<Category> root = cq.from(Category.class);
cq.select(root);
Join subjects = (Join) root.fetch("subjects");
Join topics = subjects.join("topics");
Predicate predicate1 = cb.equal(topics.get("name"), "topic2");
cq.where(predicate1);

List<Category> resultList = this.em.createQuery(cq).getResultList();

但我得到以下例外:

org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'generatedAlias2.name' [select generatedAlias0 from entities.Category as generatedAlias0 inner join fetch generatedAlias0.subjects as generatedAlias1 where generatedAlias2.name=:param0]

任何人都可以告诉我这是什么问题。顺便说一句,如果我使用join而不是fetch

,则不会出现错误

2 个答案:

答案 0 :(得分:1)

我遇到了与你完全相同的问题。通过sql查询,缺少最后一个join语句。正如您的例外告诉您的那样, generatedAlias2 在使用之前从未被别名化。

我的解决方案很简单,而且很有效。 至少将获取转换为加入

这是一个例子

Fetch subjects = root.fetch("subjects");
Join topics = (Join) subjects.fetch("topics");
Predicate predicate1 = cb.equal(topics.get("name"), "topic2");

答案 1 :(得分:0)

该解决方案有效。但是它也将获取Topic的所有数据。

JPQL中的相同查询如下所示:

Select c from Category c
join fetch c.subjects s
join s.topics t 
where t.name = 'topic2'

它可以正常工作。那么,为什么CriteriaQuery的行为有所不同?