2017-10-10 134 views
1

我创建了以下类,即教师和学生。过滤器无法处理一对多关系的JPQL查询

Java代码:学生

@Entity 
@Table(name="Student") 

public class Student { 

    @Id 
    @Column(name = "cmp_id") 
    private String cmpId; 

    @OneToOne(cascade = CascadeType.REFRESH) 
    @JoinColumn(name = "teacherid", referencedColumnName = "teacherid") 
    private Teacher teacher; 

    @OneToOne 
    @JoinColumn(name = "typeid", referencedColumnName = "typeid") 
    private Type type; 
} 

Java代码:教师

@Entity 
@Table(name="Teacher") 
public class Teacher { 

    @Id 
    @Column(name = "teacherid") 
    private String teacherid; 

    @Column(name = "teachername") 
    private String teachername; 

    @OneToMany(mappedBy = "Teacher", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @OrderBy("cmpSequence ASC") 
    private List<Student> std; 
} 

Java代码:类型

@Entity 
@Table(name="Type") 
public class Type{ 

    @Id 
    @Column(name = "typeid") 
    private Integer typeid; 

    @Column(name = "uitype") 
    private String uitype;  
} 

教师是父类和学生是孩子class.I希望所有教师和他们的学生与过滤typeid是1,但它不起作用。

以下是JPQL查询,我创建了:

SELECT teacher FROM Teacher teacher WHERE teacher.std.typeid = 1

它给了我以下错误:

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Problem compiling query.The state field path 'teacher.std.typeid' cannot be resolved to a valid type.

+1

的可能的复制[JPQL:状态字段路径不能解析为一个有效的类型(https://stackoverflow.com/questions/20056847/jpql-the-state -field-path-can-be-resolved-to-a-valid-type) – Nikolas

+0

,因为你的JPQL是无稽之谈。您不能在WHERE子句中通过它们引用多值字段,您必须执行显式JOIN。但是,然后任何基本的JPA文档将包括这 – DN1

回答

3

您的查询是错误的。你有Teacher它有std(Student),std有类型(Type),类型有typeid字段。因此,您的查询应该看起来像如下:

SELECT teacher FROM Teacher teacher 
JOIN FETCH teacher.std AS s 
INNER JOIN s.type as t 
WHERE t.typeid = 1 
+0

我做了更改,但没有工作。 – dny

+0

添加类别代码 –

+0

我添加了代码类型 – dny