Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA标准:treat实体上左连接的QuerySyntaxException_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Java JPA标准:treat实体上左连接的QuerySyntaxException

Java JPA标准:treat实体上左连接的QuerySyntaxException,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,型号: @实体 公共类用户{ @身份证 私有整数id; @JoinColumn(name=“user\u id”) @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphan=true) 私人清单项目; } @实体 @继承(策略=InheritanceType.SINGLE_表) @鉴别器列(name=“Type”) 公共抽象类项目{ @身份证 私有整数id; 私有字符串名称; } @实体 @鉴别器值(“管理”) 公共类Admi

型号:

@实体
公共类用户{
@身份证
私有整数id;
@JoinColumn(name=“user\u id”)
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphan=true)
私人清单项目;
}
@实体
@继承(策略=InheritanceType.SINGLE_表)
@鉴别器列(name=“Type”)
公共抽象类项目{
@身份证
私有整数id;
私有字符串名称;
}
@实体
@鉴别器值(“管理”)
公共类AdminProject扩展项目{
私有字符串departmentName;
}
@实体
@鉴别器值(“设计”)
公共类设计项目扩展项目{
私有字符串companyName;
}
我正在尝试使用JPA的CriteriaAPI根据
项目
实现的属性查询
用户
实体。例如,查询具有“SOME_NAME”部门的项目的所有用户(该字段在
DesignProject
上不存在)

我发现有一种方法可以通过向下转换查询的
项目
实体来实现。我正在尝试类似于:

CriteriaBuilder cb。。。
根用户根。。。
root=((From)root.join(“项目”,JoinType.LEFT);
root=cb.treat(root,AdminProject.class);
root=root.get(“部门名称”);
例外情况:

org.springframework.dao.InvalidDataAccessApiUsageException:org.hibernate.hql.internal.ast.QuerySyntaxException:无效路径:“GenerateDias2.departmentName”[从io.github.implezzub.rsql.model.User中选择GenerateDias0作为GenerateDias0左连接GenerateDias0.projects作为GenerateDias1,其中(generatedAlias2作为io.github.implezzub.rsql.model.AdminProject)。departmentName=:param0];嵌套异常为java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:无效路径:“generatedAlias2.departmentName”[从io.github.implezzub.rsql.model.User中选择generatedAlias0作为generatedAlias0左连接generatedAlias0.projects作为generatedAlias1,其中处理(generatedAlias2作为io.github.implezzub.rsql.model.AdminProject)。部门名称=:param0]

我遗漏了什么?是与连接相关的东西,还是之后的向下投射是如何发生的

编辑 在@K.Nicholas的回答之后,我成功地在一个孤立的场景中进行了查询,但在我的应用程序中没有。 但是,我注意到,
entityManager.createQuery(query)
调用在第一次调用时抛出上述异常,如果我再次调用它而不更改查询对象,它就会工作。下面是在第二次调用时生成的查询(此查询从数据库中查找我想要的对象):

从用户中选择generatedAlias0作为generatedAlias0左连接generatedAlias0.projects作为generatedAlias2,其中处理(generatedAlias2作为io.github.EmploysHub.rsql.model.AdminProject)。部门名称=:param0


为什么实体管理器在连续调用两次时会创建两个不同的查询?

正如您将看到的那样,我会对
实体做一些不同的操作。主要的问题是您使用
用户
作为根目录,并连接到
项目列表
。这是一个问题,因为您应该在
项目
类上设置外键,并将
项目
字段用作仅查询字段。这就是我所做的。这样做效果更好。这也是一个问题,因为您必须执行
加入获取
而不是
加入
,以便
项目
用户一起获取

因此,首先,实体是这样的:

@Entity
public class User { 
    @Id
    private Integer id; 
    @OneToMany(mappedBy="user")
    private List<Project> projects;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "Type")
public abstract class Project {
    @Id
    private Integer id;
    private String name;    
    @ManyToOne
    private User user;
}

@Entity
@DiscriminatorValue("Administrative")
public class AdminProject extends Project {
    private String departmentName;
}

@Entity
@DiscriminatorValue("Design")
public class DesignProject extends Project {    
    private String companyName;
}

作为补充说明,生成的查询略有不同,但我没有仔细观察它们。您应该。

感谢您的响应。我测试了双向关系,提取图并不是真正必要的。即使没有它,您的解决方案也可以工作。我认为我的问题在第一次调用
e时出现异常ntityManager.createQuery(query)
,但不是第二次。我将用我对您的答案所做的改进来编辑我的问题。
List<User> users = entityManager.createQuery("select distinct(u) from User u join fetch u.projects p where TYPE(p) = 'Administrative' and p.departmentName = 'dept1'", User.class).getResultList();
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
Join<User, Project> join = root.join("projects");
query.select(root).where(builder.equal(builder.treat(join, AdminProject.class).get("departmentName"), "dept1"));
EntityGraph<User> fetchGraph = entityManager.createEntityGraph(User.class);
fetchGraph.addSubgraph("projects");
users = entityManager.createQuery(query.distinct(true)).setHint("javax.persistence.loadgraph", fetchGraph).getResultList();