在JPA中,可以映射具有连接的自定义结果

时间:2016-08-22 09:49:51

标签: sql hibernate jpa jpa-2.0 spring-data-jpa

我有两个实体StudentAppliedCourses

@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

我有没有其他方式可以达到这个要求?

2 个答案:

答案 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,但可能不值得努力。