【发布时间】:2021-03-29 10:04:46
【问题描述】:
型号:
@Entity
public class User {
@Id
private Integer id;
@JoinColumn(name = "user_id")
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Project> projects;
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "Type")
public abstract class Project {
@Id
private Integer id;
private String name;
}
@Entity
@DiscriminatorValue("Administrative")
public class AdminProject extends Project {
private String departmentName;
}
@Entity
@DiscriminatorValue("Design")
public class DesignProject extends Project {
private String companyName;
}
我正在尝试使用 JPA 的标准 api 根据 Project 的实现的属性来查询 User 实体。例如,查询具有“SOME_NAME”部门的项目的所有用户(DesignProject 上不存在该字段)。
我看到有一种方法可以通过向下转换查询的Project 实体来实现。我正在尝试类似的东西:
CriteriaBuilder cb...
Root<User> userRoot...
root = ((From) root).join("projects", JoinType.LEFT);
root = cb.treat(root, AdminProject.class);
root = root.get("departmentName");
例外:
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: 无效路径: 'generatedAlias2.departmentName' [从 io.github.perplexhub.rsql.model.User 中选择 generatedAlias0 作为 generatedAlias0 左连接generatedAlias0.projects as generatedAlias1 where Treat(generatedAlias2 as io.github.perplexhub.rsql.model.AdminProject).departmentName=:param0];嵌套异常是 java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 无效路径: 'generatedAlias2.departmentName' [从 io.github.perplexhub.rsql.model.User 中选择 generatedAlias0 作为 generatedAlias0 左连接 generatedAlias0。项目作为 generateAlias1 where Treat(generatedAlias2 as io.github.perplexhub.rsql.model.AdminProject).departmentName=:param0]
我错过了什么?是否与加入有关,或者之后如何向下转换?
编辑
在@K.Nicholas 的回答之后,我设法使查询在一个孤立的场景中工作,但不是在我的应用程序上。
但是,我注意到entityManager.createQuery(query) 调用在第一次调用时会引发上述异常,如果我再次调用它而不更改查询对象,它就会起作用。这是第二次调用时生成的查询(此查询从数据库中找到我想要的对象):
select generatedAlias0 from User as generatedAlias0 left join generatedAlias0.projects as generatedAlias2 wheretreat(generatedAlias2 as io.github.perplexhub.rsql.model.AdminProject).departmentName=:param0
为什么实体管理器在连续调用两次时会创建两个不同的查询?
【问题讨论】:
标签: java hibernate jpa criteria-api