我有三个简单的实体:
@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
,则不会出现错误答案 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的行为有所不同?