【问题标题】:Criteria api join after fetch throws Invalid path errorCriteria api join after fetch 抛出 Invalid path 错误
【发布时间】:2017-12-21 22:44:48
【问题描述】:

我有三个简单的实体:

@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 则不会出现错误

【问题讨论】:

    标签: hibernate jpa criteria-api


    【解决方案1】:

    我遇到了和你完全相同的问题。通过sql查询,最后一个join语句不见了。正如您的例外告诉您的那样, generatedAlias2 在使用它之前根本没有被别名。

    我的解决方案很简单,而且很有效。 至少将 fetch 转换为 Join

    这是一个例子

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

    【讨论】:

      【解决方案2】:

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

      JPQL 中的相同查询看起来像这样:

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

      它会毫无问题地工作。那么为什么 CriteriaQuery 的行为会有所不同呢?

      【讨论】:

      • 我不知道为什么。这似乎是一个错误。
      • 我在我的代码中遇到了同样的问题,知道新版本是否能解决这个问题吗?我正在使用 Hibernate 核心 5.4.10.Final 运行 spring boot 2.2.4.RELEASE
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2015-11-22
      • 2020-06-17
      • 2022-07-27
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多