我有两个实体Student
和AppliedCourses
@Entity
public class Student {
@Id
private Long sid;
private String name;
private String address;
.
.
.
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "sid", referencedColumnName = "sid")
private Set<AppliedCourses> appliedCourses;
}
和
@Entity
public class AppliedCourses {
@Id
private Long apcid;
private Long sid;
private String courseName;
.
.
.
}
使用应用课程获取学生实体的jpql查询是:
select s from Student s left join fetch s.appliedCourses ac where s.id=:sid
但要求是我想在Student中只选择几个列以及应用的课程设置
即,我想要这样的东西:
select new com.foo.StudentStat(s.sid, s.name, s.appliedCourses)
from Student s left join fetch s.appliedCourses ac where s.sid=:sid
StudentStat结果类:
@Getter
@Setter
@AllArgsConstructor
public class StudentStat {
private Long sid;
private String name;
private Set<AppliedCourses> appliedCourses;
}
以上查询引发以下异常:
Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
我有没有其他方式可以达到这个要求?
答案 0 :(得分:0)
List resultWithAliasedBean = s.createQuery("select s.sid, s.name, s.appliedCourses from Student s left join fetch s.appliedCourses ac where s.sid=:sid").setResultTransformer( Transformers.aliasToBean(StudentStat.class)).list();
StudentStat pojo = (StudentStat) resultWithAliasedBean.get(0);
//如果您使用的标准可用于转换结果。
criteria.setResultTransformer(Transformers.aliasToBean(StudentStat.class));
答案 1 :(得分:0)
如果拥有实体本身不在查询结果中返回,则JPA 2.1规范(JSR 338)不允许引用由获取连接产生的集合:
JSR 338,第4.4.5.3节:
FETCH JOIN子句右侧引用的关联必须是从实体引用的关联或元素集合,或者是作为查询结果返回的可嵌入的。不允许为FETCH JOIN子句右侧引用的对象指定标识变量,因此对隐式获取的实体或元素的引用不能出现在查询的其他位置。
另一种选择可能是定义EntityGraph
,但可能不值得努力。